2011-02-04 13 views
9

Muszę pobrać kod statusu wyjścia z programu wiersza poleceń. Bez obaw, użyłem $ ?. Ale dla ftp, nawet jeśli się nie łączy, otwiera powłokę ftp, więc nie jestem w stanie zrozumieć, że połączenie nie miało miejsca.Uzyskiwanie kodu statusu wyjścia z polecenia "ftp" w powłoce linux

Spróbuj tego kodu do zrozumienia:

#!/bin/sh 

ftp 1234567 
OUT=$? 
if [ $OUT -eq 0 ];then 
    echo "ftp OK" 
else 
    echo "ftp Error: "$OUT 
fi 

exit 0 

Każda pomoc? Dzięki Filippo

+0

Możesz znacznie uprościć kod: if ftp ...; następnie ...; jeszcze ...; fi Nie ma potrzeby wyraźnego sprawdzania $? –

Odpowiedz

17

Należy szukać wiadomości sukces z polecenia ftp zamiast szuka statusu. To "226 Transfer zakończony". Możesz to potwierdzić podręcznikiem ftp w swoim systemie.

200 PORT command successful. 
150 Opening ASCII mode data connection for filename. 
226 Transfer complete. 
189 bytes sent in 0.145 seconds (0.8078 Kbytes/s) 

Oto przykładowy skrypt.

FTPLOG=/temp/ftplogfile 
ftp -inv <<! > $FTPLOG 
open server 
user ftp pwd 
put filename 
close 
quit 
! 

FTP_SUCCESS_MSG="226 Transfer complete" 
if fgrep "$FTP_SUCCESS_MSG" $FTPLOG ;then 
    echo "ftp OK" 
else 
    echo "ftp Error: "$OUT 
fi 
exit 0 
+0

Dzięki za odpowiedź! To samo zrobiłem, bazując na rozwiązaniu wysłanym przez ayush, używając dwóch plików dla wyjścia, aby uzyskać komunikat o błędzie. – Possa

1

niektóre skrypty zrobić -

ftp -n $HOST > /tmp/ftp.worked 2> /tmp/ftp.failed <<END_SCRIPT 
blah blah 
END_SCRIPT 

EXITSTATUS=$? 

if [ $EXITSTATUS != "0" ] 
then 
    # handle the error... 
fi 

wyjątkiem, że powyższe nie zawsze działa - większość klientów FTP zawsze wyjścia ze statusem 0. To prowadzi do brzydkich „fałszywie negatywnych”: w transfer plików nie powiódł się, ale skrypt nie wykrywa problemu.

Jednym ze sposobów, aby sprawdzić, czy transfer plików odbyła - przenieść ją z powrotem:

#!/bin/sh 

ftp -n << END_SCRIPT 
open $1 
user $2 $3 
put $4 
get $4 retrieval.$$ 
bye 
END_SCRIPT 

if [ -f retrieval.$$ ] 
then 
    echo "FTP of $4 to $1 worked" 
    rm -f retrieval.$$ 
else 
    echo "FTP of $4 did not work" 
fi 
+0

Dla pierwszej odpowiedzi, szczerze mówiąc, naprawdę nie bardzo rozumiem twoje rozwiązanie. – Possa

+1

Pracowałem nad twoim pierwszym rozwiązaniem i działało z małą modyfikacją: Uruchamiam ftp w trybie pełnym, jeśli w ftp.worked jest obecny "226 Transfer OK", więc transfer został wykonany! Elseif Pobieram komunikat o błędzie z ftp.failed. Dzięki! +1 dla Ciebie! – Possa

5

Jeśli trzeba coś ściągnąć i sprawdzić, czy pobieranie udało, dlaczego nie można używać wget? Obsługuje protokół FTP.

Będzie raport o stanie pobrać z kilku kodów zwrotu (cytat ze strony man):

EXIT STATUS 
    Wget may return one of several error codes if it encounters problems. 
    0 No problems occurred. 
    1 Generic error code. 
    2 Parse error---for instance, when parsing command-line options, the .wgetrc or .netrc... 
    3 File I/O error. 
    4 Network failure. 
    5 SSL verification failure. 
    6 Username/password authentication failure. 
    7 Protocol errors. 
    8 Server issued an error response. 
+0

Mam do mkdir, cd, put file ... – Possa

+0

Więc spróbuj użyć wput. – user562374

+1

Nie mogę zainstalować niczego na komputerach. – Possa

0

Ostatnim razem, kiedy potrzebne do korzystania z ftp w skrypcie, mam tak sfrustrowany tym, że w końcu znalazłem źródło klient FTP BSD-licencjonowany i po prostu zmodyfikowano go, aby nadać jej zachowania, co potrzebne i wykorzystywane to zamiast wersji dostarczonej z systemem operacyjnym.

brzydki, ale głębokość wgniecenia szef szczebla w ścianie kostki zaczynał się śmieszne

1

Spróbuj wykonać następujące skrypty.

Aby skopiować:

#!/bin/bash 
# cftp.sh 
# set -x 

FTPSERVER="$1" 
FTPPORT="$2" 
REMOTEDIR="$3" 

[[ "$REMOTEDIR" ]] || { echo -e "Usage: $0 <ftpserver> <ftpport> <remotedir> [file1] [file2] ..." > /dev/stderr ; exit 1 ; } 

L=$((BASH_ARGC-3)) 

LOCALFILES=("${BASH_ARGV[@]:0:$L}") 

RETCODE=0 

for LOCALFILE in "${LOCALFILES[@]}" 
do 
    THISRETCODE=0 
    [[ -f "$LOCALFILE" ]] || THISRETCODE=1 

    LOCALDIR="$(dirname "$LOCALFILE")" 
    LOCALFILENAME="$(basename "$LOCALFILE")" 

    [[ $THISRETCODE = 0 ]] && 
    /usr/bin/ftp -iv "$FTPSERVER" << EOF | grep -q '226 Transfer complete' || THISRETCODE=1 
    lcd $LOCALDIR 
    cd $REMOTEDIR 
    put $LOCALFILENAME 
EOF 

    RETCODE=$((RETCODE+THISRETCODE)) 
done 

exit $RETCODE 

Aby przenieść:

#!/bin/bash 
# mftp.sh 
# set -x 

FTPSERVER="$1" 
FTPPORT="$2" 
REMOTEDIR="$3" 

[[ "$REMOTEDIR" ]] || { echo -e "Usage: $0 <ftpserver> <ftpport> <remotedir> [file1] [file2] ..." > /dev/stderr ; exit 1 ; } 

L=$((BASH_ARGC-3)) 

LOCALFILES=("${BASH_ARGV[@]:0:$L}") 

RETCODE=0 

for LOCALFILE in "${LOCALFILES[@]}" 
do 
    THISRETCODE=0 
    [[ -f "$LOCALFILE" ]] || THISRETCODE=1 

    LOCALDIR="$(dirname "$LOCALFILE")" 
    LOCALFILENAME="$(basename "$LOCALFILE")" 

    [[ $THISRETCODE = 0 ]] && 
    /usr/bin/ftp -iv "$FTPSERVER" << EOF | grep -q '226 Transfer complete' || THISRETCODE=1 
    lcd $LOCALDIR 
    cd $REMOTEDIR 
    put $LOCALFILENAME 
EOF 

    [[ $THISRETCODE = 0 ]] && 
    /bin/rm -f "$LOCALFILE" || THISRETCODE=1 

    RETCODE=$((RETCODE+THISRETCODE)) 
done 

exit $RETCODE 

Oto niektóre przypadki testowe:

do kopiowania.

$ ./cftp.sh ; echo return code: $? 
Usage: ./cftp.sh <ftpserver> <ftpport> <remotedir> [file1] [file2] ... 
return code: 1 
$ ./cftp.sh ftpserver 21 /mnt/disk4/d0/test ; echo return code: $? 
return code: 0 
$ ./cftp.sh ftpserver 21 /mnt/disk4/d0/test cftp.sh mftp.sh ; echo return code: $? 
return code: 0 
$ ./cftp.sh ftpserver 21 /mnt/disk4/d0/test *ftp.sh ; echo return code: $? 
return code: 0 
$ ./cftp.sh ftpserver 21 /mnt/disk4/d0/test cftp.s ; echo return code: $? 
return code: 1 
$ ./cftp.sh ftpserver 21 /mnt/disk4/d0/test cftp.s mftp.s ; echo return code: $? 
return code: 2 
$ ./cftp.sh ftpserver 21 /mnt/disk4/d0/tes cftp.sh ; echo return code: $? 
return code: 1 

Do przeprowadzki.

$ ./mftp.sh ftpserver 21 /mnt/disk4/d0/test cftp.sh ; echo return code: $? 
/bin/rm: cannot remove `cftp.sh': Permission denied 
return code: 1 
$ echo foo > /tmp/bar 
$ ./mftp.sh ftpserver 21 /mnt/disk4/d0/test /tmp/bar ; echo return code: $? 
return code: 0 
$ ls -lha /tmp/bar 
ls: cannot access /tmp/bar: No such file or directory 

Aktualizacja: Pamiętaj, aby przeczytać man 5 netrc

0

Innym sposobem na to jest, aby sprawdzić, czy masz plik na swoim serwerze pocztowym transferu!

Coś ...

if ![ -s "$INPUT_DIR/HOP_PSA_Transactions_$BATCH_ID.csv" ] 
 
then 
 
    ## No Transactions file 
 
    FAIL_TIME=`date +"%d-%m-%Y %H:%M"` 
 
\t echo "ERROR: File HOP_PSA_Transactions_$BATCH_ID.csv not found @ $FAIL_TIME" >>$LOGFILE_DIR$LOGFILE_NAME 
 
\t exit $ERR_NO_TRANS_FILE  
 
fi

Jeśli go tam nie ma to nie przeniesienie z powodzeniem!

Powiązane problemy