Pergunta

Atualmente, estou criando um trabalho durante a noite que chama um script Unix que por sua vez cria e transfere um arquivo usando ftp. Eu gostaria de verificar todos os códigos de retorno possíveis. A página man para ftp não lista os códigos de retorno. Alguém sabe onde encontrar uma lista? Qualquer pessoa com experiência com isso? Nós temos outros scripts que grep para determinadas seqüências de retorno no log, e eles enviam um e-mail quando em erro. No entanto, eles muitas vezes perder códigos imprevistos. Estou em seguida, colocar a razão no log e e-mail.

Foi útil?

Solução

O comando ftp não retorna nada diferente de zero na maioria das implementações que eu me deparei.

É muito melhor para processar os códigos de três dígitos no registro -. E se você está enviando um arquivo binário, você pode verificar que bytes enviados estava correta

Os três códigos de dígitos são chamados 'códigos da série' e uma lista pode ser encontrada aqui

Outras dicas

Eu escrevi um script para transferir apenas um arquivo de cada vez e em que grep uso de script para verificar se a mensagem 226 Transfer complete. Se se considerar, grep retorna 0.

ftp -niv < "$2"_ftp.tmp | grep "^226 "

Instale o href="http://www.ncftp.com/" rel="nofollow noreferrer"> pacote . Ele vem com ncftpget e ncftpput que cada tentativa de upload / download de um único arquivo e retorno com um código de erro descritiva se houver um problema. Consulte a seção “Diagnóstico” do página homem .

Eu acho que é mais fácil de executar o ftp e verifique o código de saída do ftp se algo de errado se foi.

Eu fiz isso como no exemplo abaixo:

# ...
ftp -i -n $HOST 2>&1 1> $FTPLOG << EOF
quote USER $USER
quote PASS $PASSWD
cd $RFOLDER
binary
put $FOLDER/$FILE.sql.Z $FILE.sql.Z
bye
EOF

# Check the ftp util exit code (0 is ok, every else means an error occurred!)
EXITFTP=$?
if test $EXITFTP -ne 0; then echo "$D ERROR FTP" >> $LOG; exit 3; fi
if (grep "^Not connected." $FTPLOG); then echo "$D ERROR FTP CONNECT" >> $LOG; fi 
if (grep "No such file" $FTPLOG); then echo "$D ERROR FTP NO SUCH FILE" >> $LOG; fi 
if (grep "access denied" $FTPLOG ); then echo "$D ERROR FTP ACCESS DENIED" >> $LOG; fi
if (grep "^Please login" $FTPLOG ); then echo "$D ERROR FTP LOGIN" >> $LOG; fi

Editar: Para detectar erros I grep a saída do comando ftp. Mas é realmente não é a melhor solução.

Eu não sei como familier você está com um scriptLanguage como Perl, Python ou Ruby. Todos eles têm um módulo de FTP que pode ser usado. Isto permite-lhe verificar se há erros depois de cada comando. Aqui está um exemplo em Perl:

#!/usr/bin/perl -w
use Net::FTP;
$ftp = Net::FTP->new("example.net") or die "Cannot connect to example.net: $@";
$ftp->login("username", "password") or die "Cannot login ", $ftp->message;
$ftp->cwd("/pub") or die "Cannot change working directory ", $ftp->message;
$ftp->binary;
$ftp->put("foo.bar") or die "Failed to upload ", $ftp->message;
$ftp->quit;

Por essa lógica com a necessidade do usuário de trabalho para redirecionar STDERR bem do comando ftp como abaixo

ftp -i -n $HOST >$FTPLOG 2>&1 << EOF

Abaixo de comando será sempre atribuir 0 (sucesso) como porque o sucesso de comando ftp não vai retorno ou fracasso. Assim o usuário não deve depender dele

EXITFTP=$?

resposta lame eu sei, mas como sobre a obtenção das fontes de ftp e veja por si

Eu gosto da solução de Anurag, para o problema de bytes transferidos I estenderam o comando com grep -v "bytes"

ie

grep "^ 530" ftp_out2.txt | grep -v "byte"

-em vez de 530 você pode usar todos os códigos de erro como Anurag fez.

Você disse que queria para FTP o arquivo lá, mas você não disse se ou não regulares cliente BSD FTP foi a única maneira que você queria para chegar lá. O BSD FTP não dar-lhe um código de retorno para condições de erro que necessitam de tudo o que a análise, mas há toda uma série de outros programas Unix que pode ser usado para transferir arquivos por FTP, se você ou o administrador irá instalá-los. Vou dar-lhe alguns exemplos de formas de transferir um arquivo por FTP enquanto ainda captura todas as condições de erros com pequenas quantidades de código.

ftpuser é o seu ftp nome de login do usuário

FTPPASS é sua senha ftp

ARQUIVO é o arquivo local que você deseja carregar, sem qualquer informação de caminho (por exemplo file1.txt, não /whatever/file1.txt ou o que quer / file1.txt

FTPHOST é a máquina remota que deseja FTP para

REMOTEDIR é um caminho absoluto para o local na máquina remota que deseja enviar para

Aqui estão os exemplos:

onda --user $ ftpuser: $ FTPPASS -T $ FILE ftp: // $ FTPHOST /% 2f $ REMOTEDIR

ftp-upload --host $ FTPHOST --user $ ftpuser --password $ FTPPASS --como $ REMOTEDIR / $ FILE $ FILE

tnftp -u ftp: // $ ftpuser: $ FTPPASS @ $ FTPHOST /% 2f $ REMOTEDIR / $ FILE $ FILE

wput $ ftp file: // $ ftpuser: $ FTPPASS @ $ FTPHOST /% 2f $ REMOTEDIR / $ FILE

Todos estes programas irão devolver um código de saída diferente de zero se alguma coisa der errado, junto com o texto que indica que falhou. Você pode testar para isso e, em seguida, fazer o que quiser com a saída, registrá-lo, enviá-lo, etc como você desejava.

Observe o seguinte no entanto:

  1. "% 2f" é usado em URLs para indicar que o caminho a seguir é um caminho absoluto na máquina remota. No entanto, se o seu servidor FTP chroots você, você não será capaz de contornar isso.

  2. para os comandos acima que o uso de um URL real ( ftp: // etc ) para o servidor com o usuário e senha embutido nele, o nome de usuário e senha devem ser URL codificado se contiver caracteres especiais.

  3. Em alguns casos você pode ser flexível com o diretório remoto sendo arquivo absoluto e local ser apenas o nome do arquivo simples uma vez que você está familiarizado com a sintaxe de cada programa. Você só tem que adicionar uma variável de ambiente do diretório local ou apenas hardcode tudo.

  4. Se você realmente, absolutamente deve usar o cliente FTP regular, uma maneira que você pode testar para a falha é de, dentro de seu script, incluindo pela primeira vez um comando que coloca o arquivo, seguido por outro que faz um GET do mesmo arquivo de devolvê-lo com um nome diferente. Após as saídas de FTP, simplesmente teste para a existência do arquivo baixado em seu script shell, ou mesmo de checksum-lo com o original para ter certeza que transferida corretamente. Sim, isso fede, mas na minha opinião, é melhor ter um código que é fácil de ler do que as toneladas de análise para cada condição de erro possível. BSD FTP é apenas não todos que great.

Aqui está o que eu finalmente fui com. Obrigado por toda a ajuda. Todas as respostas ajuda-me conduzir na direção certa. Pode ser um pouco de exagero, verificando tanto o resultado como o log, mas deve cobrir todas as bases.

echo "open ftp_ip
pwd
binary    
lcd /out
cd /in
mput datafile.csv
quit"|ftp -iv > ftpreturn.log

ftpresult=$?

bytesindatafile=`wc -c datafile.csv | cut -d " " -f 1`    
bytestransferred=`grep -e '^[0-9]* bytes sent' ftpreturn.log | cut -d " " -f 1`    
ftptransfercomplete=`grep -e '226 ' ftpreturn.log | cut -d " " -f 1`

echo "-- FTP result code: $ftpresult" >> ftpreturn.log
echo "-- bytes in datafile: $bytesindatafile bytes" >> ftpreturn.log
echo "-- bytes transferred: $bytestransferred bytes sent" >> ftpreturn.log

if [ "$ftpresult" != "0" ] || [ "$bytestransferred" != "$bytesindatafile" ] || ["$ftptransfercomplete" != "226" ]    
then    
  echo "-- *abend* FTP Error occurred" >> ftpreturn.log    
  mailx -s 'FTP error' `cat email.lst` < ftpreturn.log
else    
  echo "-- file sent via ftp successfully" >> ftpreturn.log    
fi

Porque não basta armazenar toda a saída do comando para um arquivo de log, em seguida, verificar o código de retorno do comando e, se não for 0, enviar o arquivo de log no e-mail?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top