[FUG-BR] Redirecionamento de scp em shell script não funciona.

Renato Botelho rbgarga em gmail.com
Sábado Abril 12 09:03:53 BRT 2014


On Sex, 2014-04-11 at 17:59 -0300, Paulo Henrique - BSDs Brasil wrote:
> Saudações,
> 
> Estou com um problema quanto a redirecionamento do stdout e stderror do 
> scp para um arquivo durante a copia.
> Pesquisando achei a mesma duvida respondida pelo Eduardo Schoedler 
> informou porem sem exito[1].
> 
> E todos os redirecionamentos que tentei não deram certo.

A primeira pergunta é, qual o shell? (/bin/sh, /bin/csh)? Como você não
postou o shebang aqui não dá pra saber e isso muda muita coisa. Vou
responder considerando que seja /bin/sh, se não for me dá um toque.

> #Variaveis Gerais não alteraveis.
> 
> DATA=`date "+%d-%m-%Y"`
> SSHSERVER=hostname.intranet
> SSHUSER=root
> DIRBASE="$SSHUSER@$SSHSERVER:/mnt/BKPS/DOMINIO01/$DATA/"

Uma boa prática aqui é sempre colocar as variáveis entre {} para evitar
que o shell se confunda e pense que o @ é parte do nome da variável, por
exemplo:

DIRBASE="${SSHUSER}@${SSHSERVER}:..."

Outra pergunta, o diretório ${DATA} existe no servidor remoto? Se ele
não existir vai dar problema se eu me lembro bem. O que você pode fazer
pra garantir é rodar algo assim antes:

ssh -p 6666 ${SSHUSER}@${SSHSERVER} \
    "mkdir -p /mnt/BKPS/DOMINIO01/${DATA}" 

> #Iniciando o Backup
> echo "Entrando no diretorio do servidor de arquivos"
> cd /storage/Compartilhamentos/
> echo "Diretorio Corrente"
> pwd
> 
> 
> DIR=Administracao
> echo "Efetuando o backup do Compartilhamento $DIR Para hostname" >> 
> /var/log/backups-$DIR-$DATA.log ( Essa linha é escrita )
> scp -rv -P 6666 $DIR $DIRBASE >> /var/log/backups-$DIR-$DATA.log ( Essa 
> linha NÃO é escrita )
> echo "O Backup do Diretorio $DIR Foi concluido com exito" >> 
> /var/log/backups-$DIR-$DATA.log ( Essa linha é escrita )

O > e o >> vai escrever ou adicionar o conteúdo do stdout no arquivo,
enquanto o 2> e 2>> faz o mesmo para stderr, então vale redirecionar o
stderr para o stdout assim você garante que tudo seja gravado.

scp -rv -P 6666 ${DIR} ${DIRBASE} >> /var/log/.... 2>&1

Eu fiz um pequeno teste aqui só pra comprovar:

scp -v file server: >o 2>e

E confirmei que o scp -v escreve em stderr, no final das contas o
arquivo 'o' estava vazio e o 'e' tinha os dados, então a linha com 2>&1
deve resolver. :)

[]s
-- 
Renato Botelho



Mais detalhes sobre a lista de discussão freebsd