Capture erros em um script SFTP

1

Eu tenho um arquivo sub sh que coloca recebe uma entrada do diretório local e caminho para o diretório remoto e envia o arquivo para o diretório remoto. Se o caminho remoto for inválido, o erro não poderá ser detectado.

Exemplo de conteúdo dentro do script sh:

sftp [email protected] <<==
cd $remote_dir                      <= error happens here
lcd $local_dir                      <= error did not happen so the return code resets
put a.tar
bye
==

$result=$?
return $result

Algumas aplicações chamam o arquivo sh, então o código de retorno é usado para julgar se o arquivo foi enviado com sucesso ou não. Se sim, o backup do arquivo local será feito em algum lugar e, em seguida, será excluído.

O problema é que o shell retorna zero mesmo se o envio do arquivo falhou. O arquivo realmente não foi copiado, você pode ver que o erro acontece quando você faz o comando manualmente, o caminho não encontrado é exibido na tela, mas ao executar como um trabalho, ele falha.

Eu sei que outra maneira de fazer isso é fazer duas etapas, primeiro verificar se o caminho existe, então enviar para um arquivo de log e verificar se o log contém um erro, se não houver erro, você pode chamar o sftp put script de shell. Eu queria saber se existe outro jeito.

    
por Nap 14.03.2015 / 12:55

2 respostas

1

Lidar com erros no SFTP é uma dor: a linguagem de script SFTP não tem construções condicionais; Para fazer algo diferente de uma seqüência predefinida de comandos, você precisa analisar a saída do servidor após cada comando. Você pode fazer isso com uma ferramenta como expect , mas é um pouco trabalhoso e é difícil garantir que você tenha coberto todos os casos.

Para o exemplo que você mostrou, você pode usar

echo "put $local_dir/a.tar $remote_dir" | sftp [email protected]

mas no tratamento de erros em geral é complicado.

Portanto, não use o SFTP. Em vez disso, monte o servidor remoto usando SSHFS . Isso não requer nenhuma configuração especial no servidor, porque o SSHFS usa o SFTP sob o capô. Você só precisa ter FUSE funcionando no cliente.

O SSHFS apresenta uma visão dos arquivos remotos como um sistema de arquivos montado na máquina local. Assim, você pode usar comandos comuns como cd , cp , etc. para manipular arquivos, sem importar onde cada arquivo está localizado (exceto em termos de desempenho - por exemplo, copiar um arquivo de um local para um local remoto não ir mais rápido do que a sua largura de banda de upload).

set -e
mkdir myserver
sshfs [email protected]/ myserver
cp -p "$local_dir/a.tar" "myserver/$remote_dir/"
…
fusermount -u
    
por 16.03.2015 / 02:51
1

Execute sftp com a opção -b :

sftp -b - [email protected] <<==
cd etc.
==

Do sftp manual :

-b batchfile
Batch mode reads a series of commands from an input batchfile instead of stdin. Since it lacks user interaction it should be used in conjunction with non-interactive authentication. A batchfile of ‘-’ may be used to indicate standard input. sftp will abort if any of the following commands fail: get, put, reget, reput, rename, ln, rm, mkdir, chdir, ls, lchdir, chmod, chown, chgrp, lpwd, df, symlink, and lmkdir. Termination on error can be suppressed on a command by command basis by prefixing the command with a ‘-’ character (for example, -rm /tmp/blah*).

    
por 30.04.2015 / 22:55