&attach_input |
sftp1 |
put foo |
sftp -b sftp2_input [email protected] |
sftp -b sftp2_input [email protected] |
Infelizmente, o sftp simplesmente executa todas as solicitações do arquivo de entrada, uma após a outra; não há nenhum mecanismo para verificar se a transferência foi bem-sucedida ou não.
Como não é possível usar macros de comando, há alguma alternativa? O pacote gnu_tools vem com um programa chamado expect. Ele pode ser usado para enviar comandos, aguardar qualquer número de respostas diferentes e executar uma ação com base no que for detectado no fluxo de saída. Não sou especialista em expect, mas o script da figura 6 ajudará você a dar os primeiros passos. Se você pesquisar na web por “scripts expect”, encontrará muitas referências que o ajudarão a personalizar meu exemplo simples.
# If we get an end-of-file (eof) it means that the sftp process# Este procedimento realiza correspondências com expressões regulares em busca de sequências-chave# na saída obtida do comando que foi executado. Neste caso # Estou apenas informando o tipo de erro, mas outras medidas podem ser tomadas # também. Eu também verifico apenas dois erros. Existem outros. Você terá # para adicioná-los à medida que os encontrar. # proc checkforerrors {buf cmd} { se [regexp {.*não encontrado} $buf] { exibe “$cmd FALHA: não encontrado” retornar 1 } if [regexp {.*Permissão negada} $buf] { exibe “$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 como -1 # iniciar sftp # aguardar o prompt do SFTP, mas se recebermos um prompt de autenticação, terminando em # Mude para um diretório conveniente para testes # Chamar a função `checkforerrors`, passando todos os caracteres coletados no prompt ` enviar “put foo” enviar “get barr” enviar “quitr” |
expect sftp3.expConectamos ao servidor errado ou o servidor foi reiniciado.A chave do servidor deve ser validada antes que este script possa ser executado novamente. pronto 10:41:10 |
expect sftp3.expsftp> get barNão foi possível acessar o arquivo remoto: Arquivo ou diretório inexistente Arquivo “/SysAdmin/Noah_Davids/sftp_test/bar” não encontrado. sftp> get bar FALHA: arquivo não encontrado 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 de FTP esperar que um arquivo apareça em um determinado local e depois o transfira, ela deve verificar se o arquivo 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 comando `expect` com o script apropriado.
&label AGAIN |
