&attach_input |
sftp1 |
put foo |
sftp -b sftp2_input [email protected] |
sftp -b sftp2_input [email protected] |
Infelizmente, o sftp apenas executará todas as solicitações no arquivo de entrada, uma após a outra, não havendo nenhum mecanismo para testar se a transferência funcionou ou não.
Como as macros de comando não podem ser usadas, há alguma alternativa? O produto gnu_tools vem com um programa chamado expect. Ele pode ser usado para enviar comandos, aguardar qualquer número de respostas diferentes e realizar alguma ação com base no que vê no fluxo de saída. Não sou especialista em expect, mas o script na figura 6 ajudará você a começar. Se pesquisar “scripts expect” na web, encontrará muitas referências que ajudarão você a personalizar meu exemplo simples.
# If we get an end-of-file (eof) it means that the sftp process# Este procedimento faz correspondências de expressões regulares procurando por strings-chave# na saída coletada do comando que foi executado. Neste caso Estou apenas relatando o tipo de erro, mas outras coisas podem ser feitas. # também. Eu também verifico apenas 2 erros. Existem outros. Você terá # para adicioná-los à medida que os encontrar. # proc verificar erros {buf cmd} { if [regexp {.*não encontrado} $buf] { coloca "$cmd FALHA: não encontrado" retornar 1 } if [regexp {.*Permissão negada} $buf] { coloca “$cmd FALHA: problemas de acesso” retornar 1 } retornar 0 }# defina o tempo limite como -1 para que não haja tempo limite. O padrão é 10 segundos. # e a maioria das transferências de arquivos leva mais tempo do que isso. Decidi não definir # tempo limite, você pode alterar isso. definir tempo limite -1 # iniciar sftp # aguarde o prompt sftp, mas se recebermos um prompt de autenticação, terminando em # mude para um diretório conveniente para teste # verificação de erros passando todos os caracteres coletados para o prompt enviar “put foor” enviar “get barr” enviar “quitr” |
expect sftp3.expConectamos ao servidor errado ou o servidor foi recarregado.A chave do servidor deve ser validada antes que este script possa ser executado novamente. pronto 10:41:10 |
expect sftp3.expsftp> obter barraNão foi possível localizar o arquivo remoto: Não existe tal arquivo ou diretório Arquivo “/SysAdmin/Noah_Davids/sftp_test/bar” não encontrado. sftp> obter barra FALHA: não encontrado pronto 10:42:11 |
Por fim, no meu blog sobre FTP, mencionei que o FTP era capaz de ler arquivos que ainda estavam abertos e que, ocasionalmente, isso resultou na transferência de arquivos incompletos. Sugeri que, se a macro FTP aguarda que um arquivo apareça em um local e, em seguida, o transfere, a macro deve verificar se ele não está mais bloqueado. O mesmo problema pode ocorrer com o SFTP e a solução é a mesma. Você pode colocar a verificação de bloqueio do arquivo em uma macro de comando (figura 9) e, quando o arquivo não estiver mais bloqueado, chamar o expect com o script apropriado.
&label AGAIN |
