Bash Script para fazer backup de arquivos -- acos campo com terminal campo com bash campo com nas camp apple Relacionado O problema

Bash script to back up files


0
vote

problema

português

Eu sou novo para bash, então estou um pouco perdido com este script que fiz para fazer backup de alguns diretórios da máquina local em uma NAS. O NAS conterá apenas um certo número de arquivos de backup, então antes de copiar um novo, excluo o mais antigo do existente.

Primeiro de todo o script define todos os caminhos, diretório e nomes de arquivos em variáveis ​​

  # 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`    

Então, usando os nomes de variáveis: Cria um arquivo compactado de tar do diretório original. O arquivo TAR é mantido em um diretório temporário separado.

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

Exclui o mais antigo dos arquivos TAR da NAS:

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

Copia o arquivo tar para o NAS:

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

Exclui o arquivo tar do diretório temporário:

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

O script é executado sem supervisão por um usuário que tenha sido devidamente autorizado através de alterações no arquivo sudoers. Tudo funciona suavemente, exceto nesta etapa:

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

O arquivo de log não mostra erros, mas não há nada no local do ABCDEFGHIJKLMNABCDEFGHIJKLMN6 Variável, como ele não é resolvido, portanto, é executado:

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

No entanto, se eu executar os comandos no terminal um por um, eu vou trabalhar bem. Pode ser um problema de permissões do usuário?

english

I am new to bash, so I'm a bit lost with this script I made to backup some directories from the local machine into a NAS. The NAS will contain only a certain number of backed up files, so before copying a new one I delete the oldest of the existing.

First of all the script defines all the paths, directory and file names into variables

# 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` 

Then using the variable names it: Creates a tar compressed file from the original directory. The tar file is kept in a separate, temporary directory.

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

Deletes the older of the tar files from the NAS:

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

Copies the tar file into the NAS:

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

Deletes the tar file from the temp directory:

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

The script is run unattended by a user that has been duly authorized through changes in the sudoers file. Everything runs smoothly except in this step:

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

The log file shows no errors but there's nothing in the place of the $OLDTAR variable, like it is not resolved, so it actually executes:

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

However if I run the commands in the terminal one by one I get it to work well. It may be a problem of user permissions?

           
         
         

Lista de respostas

3
 
vote

Esta não é uma resposta real, mas eu iria separar sua pergunta em 4 tarefas menores.

    .
  1. Configurar permissões / ACL para que você não precise de sudo se possível
  2. Basta configurar um script para atacar os arquivos localmente - e date carimbo o backup
  3. Configure um script para rsync o diretório de backup do servidor local para o NAS. Você pode usar o --delete opção ou --delete-after se você quiser expirar backups antigos ao longo do tempo.
  4. Configure um script para purgar backups datados na pasta de backup local

Também - se você não puder evitar usar root / sudo - adicionar esta linha tmutil snapshot antes de excluir e verificar uma vez para permitir backups locais abcdefgijklmn4 em geral Você tem um backup se um script excluir muito. A máquina de tempo permitirá que você se recupere rapidamente a partir de quaisquer erros na lógica dos scripts.

Por último - para depuramento de depuração - executar bash -x script ou definir depuração set -x para ver os valores das variáveis ​​e ver se você tem um erro de erro / erro de codificação ou outra coisa errado.

 

This is not a real answer, but I would pick apart your question into 4 smaller tasks.

  1. Set up permissions / ACL so you don't need sudo if at all possible
  2. Just set up a script to tar the files locally - and date stamp the backup
  3. Set up a script to rsync the backup directory from the local server to the NAS. You can use the --delete option or --delete-after if you want to expire old backups over time.
  4. Set up a script to purge dated backups in the local backup folder

Also - if you can't avoid using root /sudo - add this line tmutil snapshot before any delete and check one time to allow for local backups tmutil enablelocal in general so you have a backup if a script deletes too much. Time Machine will allow you recover rapidly from any errors in the logic of the scripts.

Lastly - for debugging bash - run bash -x script or set debugging set -x to see the values of the variables and see if you have a path error / encoding error or something else amiss.

 
 
   
   
2
 
vote
vote
Melhor resposta
 

Eu encontrei o que estava acontecendo: o usuário que executa o script não tinha permissões suficientes para ler no diretório NAS, então o resultado disso:

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

foi uma string vazia, é aí que o script falhou. Em vez disso, se eu fizer:

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

funciona como eu esperava.

 

I've found what was going on: the user executing the script had not sufficient permissions to read on the NAS directory, so the result of this:

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

was an empty string, this is where the script failed. Instead If I do:

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

it works as I expected.

 
 

Perguntas relacionadas

1  Como excluir arquivos / pastas "invisíveis" (backups do dispositivo)  ( How to delete invisible files folders device backups ) 
Eu estou tentando recuperar cerca de 162 GB de espaço de transmissão, excluindo backups do dispositivo de ~ / biblioteca / application suport / mobilesync / b...

2  Máquina de horário de leão de montanha não pode se conectar de forma confiável a LaCie 2Big NAS  ( Mountain lion time machine cant reliably connect to lacie 2big nas ) 
Eu tenho usado um lacie 2big NAS para fazer backup de meus Macs por um ano ou dois agora, e geralmente funciona bem. Agora, no entanto, temos um par de Mounta...

2  Excluição de backups antigos na máquina do tempo  ( Deleting of old backups in time machine ) 
Eu tenho WD-My Book World of 1TB e eu lutei por algum tempo para configurá-lo corretamente para usá-lo como um disco para uso do tempo do tempo no Mac OS X Yo...

2  Timemachine Backup do APFS SSD em Mojave nunca completa  ( Timemachine backup of apfs ssd in mojave never completes ) 
Eu estou tentando configurar o timemachine para uma unidade de armazenamento em anexo de rede (NAS). Minha configuração é bem sucedida, mas como muitos outros...

11  As transferências de LAN usam Ethernet e Wi-Fi por padrão?  ( Do lan transfers use both ethernet and wifi by default ) 
Então, estou fazendo uma transferência de 100 + GB sobre a minha LAN do meu iMac para a minha NAS, eu estava simplesmente imaginando se utilizaria tanto a Eth...

0  Acessando um dispositivo NAS do código Python no Mac-OS [FECHADO]  ( Accessing a nas device from python code on mac os ) 
. FECHADO. Esta questão é off-tópico . Atualmente não está aceitando respostas. Quer melh...

1  NAS Servidor Desconectando da conexão SMB  ( Nas server disconnecting from smb connection ) 
Eu não consigo descobrir: A cada poucos minutos, tenho que conectar-se ao NAS Synology (DS1517 +), Número DSM (DSM 6.2.1-23824) do meu MacBook: GO & GT; Co...

2  Como a máquina do tempo verifica para "corrupção de tempo de execução" e como eu redefina?  ( How does time machine check for runtime corruption and how do i reset it ) 
Depois de trabalhar muito feliz por meses, a máquina do tempo que funciona com uma NAS como um destino de backup decidiu repentinamente que meu backup é "corr...

0  IOS LAN Samba Compartilhar Acesso  ( Ios lan samba share access ) 
A Western Digital MyCloud NAS é fixado em uma LAN: Existe alguma funcionalidade nativa do iOS 12.x que permite que os usuários descubra os recursos da LAN-Sam...

2  Grande matriz HD externa para um Mac Mini com RAID para executar o Mac Mini como NAS  ( Large external hd array for a mac mini with raid to run the mac mini as a nas ) 
Estou olhando para obter uma NAS para armazenar cerca de 12 TB de dados (mas gostaria de opções de expansão no futuro). O principal objetivo da NAS seria: ...




© 2022 pergunte.org All Rights Reserved. Casa de perguntas e respostas todos os direitos reservados


Licensed under cc by-sa 3.0 with attribution required.