Como você dispara uma sequência de comandos na ferramenta de comando?

2

Eu fiz uma pergunta anterior (deletei) e ainda não entendi porque é tão difícil entender o que estou tentando perguntar, mas vou tentar mais uma vez e com mais clareza.

Estou copiando várias pastas do servidor A para o servidor B, mas o comando para cada processo de cópia ('rsync') deve ser executado a partir da linha de comando, uma vez para cada pasta.

Então, para copiar a pasta A para o servidor X, eu executo um comando rsync e, uma vez feito o processo de cópia, eu executo um novo comando rsync para copiar a pasta B para o servidor X.

Eu fiz uma pequena pesquisa, que provavelmente ajuda você a responder minhas necessidades. Mas eu estou procurando uma maneira de escrever vários comandos de uma só vez, que é acionado um após o outro se o anterior tiver terminado com suas ações (assim acabado de copiar).

Geralmente, vários comandos são separados em uma linha por ; semicolons ou && E comercial. A diferença entre é que, se o comando primeiro / anterior falhar com ponto e vírgula, ele continuará. Se o comando produzir um erro e você tiver usado o "e" comercial, ele será interrompido.

Assim, usei ponto-e-vírgula no meu processo e deixei meu computador funcionar durante a noite ... mas ele só executou o primeiro comando, mesmo que eu tenha escrito vários em uma linha separados por ponto e vírgula. Então deveria ter executado todos eles, um por um ... Então, primeiro: Como eu executo vários comandos corretamente e B, o que está errado com o meu comando?

sudo rsync -v -v -r -h -t —progress /Volumes/My\ Book/Backups.backupdb/MbpScs-van-iSCS/2014-01-02-233653/SSDaeffer /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap ; 
sudo rsync -v -v -r -h -t —progress /Volumes/My\ Book/Backups.backupdb/MbpScs-van-iSCS/2014-01-09-152837/SSDaeffer /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap ;
sudo rsync -v -v -r -h -t —progress /Volumes/My\ Book/Backups.backupdb/MbpScs-van-iSCS/2014-01-20-201229/SSDaeffer /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap ;
sudo rsync -v -v -r -h -t —progress /Volumes/My\ Book/Backups.backupdb/MbpScs-van-iSCS/2014-02-21-130931/SSDaeffer /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap ;
sudo rsync -v -v -r -h -t —progress /Volumes/My\ Book/Backups.backupdb/MbpScs-van-iSCS/2014-03-05-113353/SSDaeffer /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap ;
sudo rsync -v -v -r -h -t —progress /Volumes/My\ Book/Backups.backupdb/MbpScs-van-iSCS/2014-03-19-162703/SSDaeffer /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap ;
sudo rsync -v -v -r -h -t —progress /Volumes/My\ Book/Backups.backupdb/MbpScs-van-iSCS/2014-05-13-215016/SSDaeffer /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap ;
sudo rsync -v -v -r -h -t —progress /Volumes/My\ Book/Backups.backupdb/MbpScs-van-iSCS/2014-06-01-231321/SSDaeffer /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap

Eu os separei com intervalos aqui para fins de legibilidade. Normalmente é uma linha inteira

Isso geralmente acontece com um caractere ; ponto-e-vírgula

    
por Sander Schaeffer 06.09.2014 / 10:55

3 respostas

12

Para fins de repetição, sugiro colocar as linhas em um script pequeno, mas sem a palavra-chave sudo :

#!/bin/bash

rsync -v -v -r -h -t --progress /Volumes/My\ Book/Backups.backupdb/MbpScs-van-iSCS/2014-01-02-233653/SSDaeffer /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap  
rsync -v -v -r -h -t --progress /Volumes/My\ Book/Backups.backupdb/MbpScs-van-iSCS/2014-01-09-152837/SSDaeffer /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap 
rsync -v -v -r -h -t --progress /Volumes/My\ Book/Backups.backupdb/MbpScs-van-iSCS/2014-01-20-201229/SSDaeffer /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap 
rsync -v -v -r -h -t --progress /Volumes/My\ Book/Backups.backupdb/MbpScs-van-iSCS/2014-02-21-130931/SSDaeffer /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap 
rsync -v -v -r -h -t --progress /Volumes/My\ Book/Backups.backupdb/MbpScs-van-iSCS/2014-03-05-113353/SSDaeffer /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap 
rsync -v -v -r -h -t --progress /Volumes/My\ Book/Backups.backupdb/MbpScs-van-iSCS/2014-03-19-162703/SSDaeffer /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap 
rsync -v -v -r -h -t --progress /Volumes/My\ Book/Backups.backupdb/MbpScs-van-iSCS/2014-05-13-215016/SSDaeffer /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap 
rsync -v -v -r -h -t --progress /Volumes/My\ Book/Backups.backupdb/MbpScs-van-iSCS/2014-06-01-231321/SSDaeffer /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap

Para executar a série de comandos, digite:

chmod +x myscript.sh
sudo ./myscript.sh

Dessa forma, sudo não está expirando durante um longo comando. Não há necessidade de um ponto e vírgula em um arquivo de script. Por padrão, cada linha pode falhar e a próxima é executada (para alterar isso, use set -o errexit ).

Eu também notei algo suspeito em seus comandos. para a opção --progress você não usou um hífen regular , mas algum outro caractere parecido. Esta poderia ser outra fonte dos erros que você está vendo.

    
por 06.09.2014 / 11:33
8

Observe que o uso do rsync é rsync [OPTION]... SRC [SRC]... DEST , o que significa que isso pode ser mais simplesmente escrito como

 rsync -r -t -h /src1dir /src2 /src3 /destdir

que não está sujeito a tempos limite da sessão sudo. Você não perguntou, mas a opção -a é muito mais abrangente do que -r -t .

    
por 06.09.2014 / 11:42
3

Existem muitas maneiras de fazer isso. A abordagem que você tentou teria funcionado perfeitamente se cada sudo não exigisse que você inserisse uma senha. Desde então, os comandos seriam pendurados desde o segundo pediria uma senha e você não estava lá para dar. Portanto, você precisa de uma maneira de executar tudo com uma chamada única sudo . Aqui estão algumas maneiras de fazer isso.

  1. Escreva os comandos em um script e execute o script com sudo , conforme explicado na resposta a>.

  2. Gere um único rsync fornecendo várias pastas de origem como sugerido por @msw.

  3. Construa os comandos dinamicamente. Parece que você deseja copiar todas as pastas SSDaeffer para /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap . Isso significa que você poderia simplesmente escrever

    sudo rsync -vah /Volumes/My\ Book/Backups.backupdb/MbpScs-van-iSCS/*/SSDaeffer \
                    /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap  
    

    Isso copiará todas as pastas SSDaeffer que são subpastas de um diretório em /Volumes/My\ Book/Backups.backupdb/MbpScs-van-iSCS to /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap . Isso pressupõe que você queira todas as pastas SSDaeffer . Se você quiser apenas alguns deles, poderá listá-los em um arquivo:

    $ cat file
    2014-01-02-233653
    2014-01-09-152837
    2014-01-20-201229
    2014-02-21-130931
    

    Em seguida, leia o arquivo para obter os nomes que você deseja:

    sudo while read dir; do 
     rsync -vah /Volumes/My\ Book/Backups.backupdb/MbpScs-van-iSCS/$dir/SSDaeffer \
                /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap;
    done < file
    

    Se os nomes das pastas puderem conter espaços em branco ou outros caracteres estranhos, use isso:

    while IFS= read -r dir; do 
     rsync -vah /Volumes/My\ Book/Backups.backupdb/MbpScs-van-iSCS/$dir/SSDaeffer \
                    /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap;
    done < file
    
  4. Inicie um shell de root com sudo -i . Isso permitirá que você faça login como o superusuário e, em seguida, poderá executar comandos para o conteúdo do seu coração:

    $ sudo -i
    Password:
    # rsync -avh /from/dir1 /to/dir
    # rsync -avh /from/dir2 /to/dir
    # rsync -avh /from/dir3 /to/dir
    
por 06.09.2014 / 13:35