2011-02-04 41 views
9

Tôi cần truy xuất lại mã trạng thái thoát khỏi chương trình dòng lệnh. Đừng lo, tôi đã sử dụng $ ?. Nhưng đối với ftp, ngay cả khi nó không kết nối, nó sẽ mở vỏ ftp, vì vậy tôi không thể hiểu rằng kết nối không diễn ra.Lấy mã trạng thái thoát khỏi lệnh 'ftp' trong vỏ linux

Hãy thử mã này cho hiểu:

#!/bin/sh 

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

exit 0 

Bất kỳ sự giúp đỡ? Cảm ơn Filippo

+0

Bạn có thể đơn giản hóa rất nhiều mã: nếu ftp ...; sau đó ...; khác ...; fi Không cần phải kiểm tra một cách rõ ràng $? –

Trả lời

17

Bạn nên tìm kiếm thông báo thành công từ lệnh ftp chứ không phải là tìm kiếm một trạng thái. Đó là "226 Chuyển hoàn thành". Bạn có thể xác nhận nó với hướng dẫn ftp trên hệ thống của bạn.

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) 

Đây là tập lệnh mẫu.

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

Cảm ơn bạn đã trả lời! Đó là điều tương tự mà tôi đã làm, dựa trên giải pháp được đăng bởi ayush, sử dụng hai tệp cho đầu ra để có được lỗi thông báo. – Possa

1

một số kịch bản làm -

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 

Trừ rằng ở trên không phải lúc nào làm việc - hầu hết khách hàng FTP exit luôn có trạng thái 0. Điều này dẫn đến "âm tính giả" xấu xí: các chuyển tệp không thành công, nhưng tập lệnh không phát hiện sự cố.

Một cách để xác minh rằng một chuyển tập tin đã diễn ra - chuyển nó trở lại:

#!/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

Đối với câu trả lời đầu tiên, thành thật mà nói, tôi thực sự không hiểu rõ giải pháp của bạn. – Possa

+1

Tôi đã làm việc trên giải pháp đầu tiên của bạn và nó đã làm việc với một chút sửa đổi: Tôi chạy ftp trong chế độ tiết, nếu trong ftp.worked là hiện tại "226 Chuyển OK" để chuyển đã được thực hiện! Elseif Tôi lấy lại thông báo lỗi từ ftp.failed. Cảm ơn! +1 cho bạn! – Possa

5

Nếu bạn cần phải tải về một cái gì đó và xem liệu khi tải về thành công, tại sao bạn không sử dụng wget? Nó hỗ trợ giao thức FTP.

Nó sẽ báo cáo tình trạng của tải với một số mã trở về (trích dẫn từ trang người đàn ông):

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

Tôi phải mkdir, cd, đặt tập tin ... – Possa

+0

Vì vậy, hãy thử sử dụng wput. – user562374

+1

Tôi không thể cài đặt bất cứ thứ gì trên máy. – Possa

0

Lần cuối cùng tôi cần thiết để sử dụng ftp trong một kịch bản, tôi đã quá thất vọng với nó rằng cuối cùng tôi đã tìm thấy một nguồn ftp client BSD được cấp phép và chỉ cần sửa đổi nó để cho nó hành vi tôi cần, và sử dụng thay vì phiên bản được cung cấp cùng với hệ điều hành.

Xấu xí, nhưng độ sâu của các lỗ đầu cấp trong tường khối lập phương bắt đầu lố bịch

1

Hãy thử các tập lệnh sau.

Để sao chép:

#!/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 

Để di chuyển:

#!/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 

Dưới đây là một số trường hợp thử nghiệm:

Đối với sao chép.

$ ./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 

Để di chuyển.

$ ./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 

Cập nhật: Nhớ đọc man 5 NETRC

0

Một cách khác xung quanh này là để kiểm tra xem bạn có các tập tin trên bài chuyển máy chủ của bạn!

Cái gì đó như ...

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

Nếu nó không có ở đó thì nó đã không được chuyển nhượng thành công!

Các vấn đề liên quan