Frage

Ich bin zur Schaffung eines über Nacht Job, ein Unix-Skript ruft die wiederum erstellt und überträgt eine Datei mit ftp. Ich möchte alle möglichen Rückgabecodes überprüfen. Die man-Seite für ftp nicht Rückgabecodes aufzulisten. Weiß jemand, wo eine Liste zu finden? Jeder, der Erfahrung mit diesem? Wir haben andere Skripte, die für bestimmte Rückkehr Strings im Protokoll grep, und sie senden eine E-Mail, wenn in Fehler. Allerdings verpassen sie oft unerwartete Codes. Ich stelle dann den Grund in das Protokoll und die E-Mail.

War es hilfreich?

Lösung

Der ftp Befehl zurückgeben nicht alles andere als Null bei den meisten Implementierungen, die ich kenne.

Es ist viel besser, den dreistellige Codes in dem Protokoll zu verarbeiten - und wenn Sie eine Binärdatei senden, können Sie überprüfen, ob gesendeten Bytes korrekt war

.

Die dreistelligen Codes sind ‚Serien-Codes‘ genannt und eine Liste finden Sie hier

Andere Tipps

schrieb ich ein Skript nur eine Datei zu einem Zeitpunkt, zu übertragen und in dieser Skript Verwendung grep für die 226 Transfer complete Nachricht zu überprüfen. Wenn er sie findet, grep 0 zurück.

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

Installieren Sie das ncftp Paket. Es kommt mit ncftpget und Manpage rel="nofollow.

Ich denke, dass es einfacher ist, die ftp und prüfen Sie den Exit-Code von ftp zu laufen, wenn etwas schief gelaufen ist.

Ich tat dies, wie im folgenden Beispiel:

# ...
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

Edit: fangen Fehler, die ich den Ausgang des ftp-Befehl grep. Aber es ist wirklich, es ist nicht die beste Lösung.

Ich weiß nicht, wie familier Sie mit einer Scriptsprache wie Perl, Python oder Ruby sind. Sie alle haben ein FTP-Modul, das Sie verwendet werden kann. Dadurch können Sie auf Fehler nach jedem Befehl überprüfen. Hier ist ein Beispiel in 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;

Für diese Logik Benutzer arbeiten müssen STDERR als auch von ftp-Befehl wie unten

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

Im Folgenden Befehl zuweisen immer 0 (Erfolg) als weil ftp-Befehl wird nicht Erfolg oder Misserfolg zurück. So Benutzer sollten nicht davon abhängen

EXITFTP=$?

lame Antwort weiß ich, aber wie über die FTP-Quellen bekommen und für sich selbst sehen

Ich mag die Lösung von Anurag, für das Problem übertragen Bytes ich den Befehl erweitert mit grep -v „Bytes“

dh

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

-instead von 530 Sie alle Fehlercodes verwenden können, wie Anurag hat.

Sie sagten, Sie die Datei dort FTP wollen, aber du hast nicht sagen, ob oder nicht regelmäßig BSD FTP-Client der einzige Weg ist, man wollte es dorthin zu gelangen. BSD FTP nicht Ihnen einen Return-Code für Bedingungen gibt Fehler erforderlich macht all das Parsing, aber es gibt eine ganze Reihe von anderen Unix-Programmen, die verwendet werden können Dateien per FTP zu übertragen, wenn Sie oder Ihr Administrator installieren. Ich gebe Ihnen einige Beispiele dafür, wie eine Datei per FTP zu übertragen, während immer noch alle Fehlerbedingungen mit wenig Mengen von Code zu kontrollieren.

FTPUSER ist Ihr ftp Benutzer-Login-Name

FTPPASS ist Ihr FTP-Passwort

Datei ist die lokale Datei ohne Pfadinformationen hochladen möchten (zB file1.txt, nicht /whatever/file1.txt oder was auch immer / file1.txt

FTPHOST ist die Remote-Maschine, die Sie zu

FTP wollen

remotedir ist ein absoluter Pfad zu dem Verzeichnis auf dem Remote-Gerät, das Sie hochladen möchten

Hier sind die Beispiele:

curl --user $ FTPUSER: $ FTPPASS -T $ FILE ftp: // $ FTPHOST /% 2f $ remotedir

FTP-Upload --host $ FTPHOST --user $ FTPUSER --password $ FTPPASS --as $ remotedir / $ FILE $ FILE

tnftp -u ftp: // $ FTPUSER: $ FTPPASS @ $ FTPHOST /% 2f $ remotedir / $ FILE $ FILE

wput $ FILE ftp: // $ FTPUSER: $ FTPPASS @ $ FTPHOST /% 2f $ remotedir / $ FILE

Alle diese Programme wird eine von Null verschiedene Exit-Code zurück, wenn etwas überhaupt schief geht, zusammen mit Text, der angibt, was fehlgeschlagen. Sie können dies testen, und dann tun, was Sie mit dem Ausgang wollen, melden Sie es, schicken Sie es, etc, wie man wollte.

Bitte beachten Sie folgende jedoch:

  1. „% 2f“ in URLs verwendet, um anzuzeigen, dass der folgenden Pfad ein absoluter Pfad auf dem entfernten Rechner ist. Allerdings, wenn Ihr FTP-Server chroots Sie, Sie nicht in der Lage sein, dies zu umgehen.

  2. für die obigen Befehle dass eine tatsächliche URL ( ftp: // etc ) an den Server mit dem Benutzer und das Kennwort in es eingebettet ist, der Benutzername und das Passwort muss in der URL-codiert, wenn es Sonderzeichen enthält.

  3. In einigen Fällen können Sie mit dem Remote-Verzeichnis ist absolut und lokale Datei waren nur die einfachen Dateinamen flexibel sein, wenn Sie mit der Syntax des jeweiligen Programms vertraut sind. Sie könnten nur ein lokales Verzeichnis Umgebungsvariable hinzufügen müssen oder einfach alles hart codieren.

  4. Wenn Sie wirklich, absolut regelmäßigen FTP-Client verwenden müssen, eine Möglichkeit, Sie für Fehler testen können, ist durch, in Ihrem Skript, einschließlich zuerst einen Befehl, der die Datei Versetzt, gefolgt von einer anderen, der eine GET des gleiche tut Datei unter einem anderen Namen zurück. Nach dem FTP verläßt, testen Sie einfach für die Existenz der heruntergeladenen Datei in Ihrem Shell-Skript oder sogar Prüfsumme es gegen die ursprünglichen sicherzustellen, dass es korrekt übertragen. Ja, das stinkt, aber meiner Meinung nach ist es besser, den Code zu haben, die einfach zu lesen, als täten Tonnen für jede mögliche Fehlerbedingung zu parsen. BSD FTP ist einfach nicht so toll.

Hier ist, was ich mit endlich ging. Vielen Dank für all die Hilfe. Alle Antworten helfen Sie mir in die richtige Richtung führen. Es mag ein wenig übertrieben sein, sowohl das Ergebnis und das Protokoll überprüft, aber es sollte alle Basen bedecken.

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

Warum nicht einfach alle Ausgaben speichern aus dem Befehl in eine Protokolldatei, dann überprüfen Sie den Rückgabecode von dem Befehl, und wenn sie nicht 0 sind, die Log-Datei in der E-Mail senden?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top