Script di Bash per il backup dei file

0

Sono nuovo per bash, quindi sono un po 'perso con questo script che ho fatto per fare il backup di alcune directory dalla macchina locale in un NAS. Il NAS conterrà solo un certo numero di file di backup, quindi prima di copiarne uno nuovo cancellerò il più vecchio esistente.

Prima di tutto lo script definisce tutti i percorsi, i nomi di directory e file in variabili

# Defines directories
ORIGEN='/Library/path-to-directories/'
DESTINAS='/Volumes/path-to-backup/'
DESTITAR='/Library/path-to-temp/'

# Defines names of the files and folders to delete (OLDDIR) and copy (NEWDIR)
OLDTAR='/bin/ls /Volumes/path-to-backup/ | head -n 1'
NEWDIR='/bin/ls /Library/path-to-directories/ | tail -n 1'

Quindi, usando la variabile, lo chiama: Crea un file compresso tar dalla directory originale. Il file tar è conservato in una directory temporanea separata.

/usr/bin/sudo /usr/bin/tar -czf "$DESTITAR$NEWDIR.tgz" "$ORIGEN$NEWDIR"

Elimina il vecchio dei file tar dal NAS:

/usr/bin/sudo /bin/rm $DESTINAS$OLDTAR

Copia il file tar nel NAS:

/usr/bin/sudo /bin/cp -Rp "$DESTITAR$NEWDIR.tgz" $DESTINAS

Elimina il file tar dalla directory temp:

/usr/bin/sudo /bin/rm -f "$DESTITAR$NEWDIR.tgz"

Lo script viene eseguito senza sorveglianza da un utente che è stato debitamente autorizzato attraverso le modifiche nel file sudoers. Tutto funziona senza intoppi tranne in questo passaggio:

/usr/bin/sudo /bin/rm $DESTINAS$OLDTAR

Il file di registro non mostra errori, ma non c'è nulla al posto della variabile $OLDTAR , come se non fosse risolto, quindi esegue effettivamente:

/usr/bin/sudo /bin/rm /Volumes/path-to-backup/

Tuttavia, se eseguo i comandi nel terminale uno per uno, ottengo che funzioni correttamente. Potrebbe trattarsi di un problema con le autorizzazioni utente?

    
posta naio 10.10.2016 - 18:33
fonte

2 risposte

1

Ho trovato che cosa stava succedendo: l'utente che eseguiva lo script non disponeva di autorizzazioni sufficienti per leggere nella directory NAS, quindi il risultato di questo:

OLDTAR=$(/bin/ls /Volumes/path-to-backup/ | head -n 1)

era una stringa vuota, questo è il punto in cui lo script ha fallito. Invece se lo faccio:

OLDTAR=$(/usr/bin/sudo /bin/ls /Volumes/path-to-backup/ | head -n 1)

funziona come mi aspettavo.

    
risposta data 13.10.2016 - 10:11
fonte
2

Questa non è una risposta reale, ma selezionerei la tua domanda in 4 compiti più piccoli.

  1. Configura le autorizzazioni / ACL in modo che non sia necessario sudo se possibile
  2. Basta impostare uno script per tarare i file localmente e la data imprimere il backup
  3. Configura uno script per sincronizzare la directory di backup dal server locale al NAS. Puoi utilizzare l'opzione --delete o --delete-after se desideri scadere i vecchi backup nel tempo.
  4. Configura uno script per eliminare i backup datati nella cartella di backup locale

Inoltre - se non puoi evitare di utilizzare root / sudo - aggiungi questa riga tmutil snapshot prima di qualsiasi eliminazione e verifica una volta per consentire i backup locali tmutil enablelocal in generale in modo da avere un backup se uno script cancella troppo . Time Machine ti permetterà di recuperare rapidamente da eventuali errori nella logica degli script.

Infine - per il debug di bash - esegui bash -x script o imposta il debug di set -x per vedere i valori delle variabili e vedere se hai un errore di percorso / errore di codifica o qualcos'altro male.

    
risposta data 10.10.2016 - 22:00
fonte

Leggi altre domande sui tag