在linux shell中从“ftp”命令获得退出状态代码

我需要从命令行程序中检索退出状态代码。 不用担心,我用$ ?. 但是对于ftp,即使它没有连接,它也会打开ftp shell,所以我不能理解连接没有发生。

试试这个代码的理解:

#!/bin/sh ftp 1234567 OUT=$? if [ $OUT -eq 0 ];then echo "ftp OK" else echo "ftp Error: "$OUT fi exit 0 

任何帮助? 感谢菲利波

您应该从ftp命令寻找成功消息,而不是寻找状态。 这是“226转移完成”。 您可以在您的系统上使用ftp手册进行确认。

 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) 

这是一个示例脚本。

 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 

如果你需要下载东西,看下载是否成功,为什么不使用wget ? 它支持FTP协议。

它会报告下载的状态与几个返回代码(从手册页引用):

 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. 

一些脚本做 –

 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 

除了上述情况并不总是有效 – 大多数FTP客户端总是以0的状态退出。这导致了丑陋的“错误否定”:文件传输失败,但是脚本没有检测到问题。

验证文件传输发生的一种方法是将其传回:

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

尝试以下脚本。

复制:

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

移动:

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

以下是一些测试用例:

用于复制。

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

移动。

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

更新:请记住阅读man 5 netrc

最后一次我需要在脚本中使用ftp,我非常沮丧,终于找到了一个BSD许可的ftp客户端源代码,并简单地修改了它,使其具有我所需要的行为,并使用它来代替提供的版本操作系统。

丑陋,但立方体墙上的头部凹陷的深度开始变得荒谬

解决这个问题的另一个方法是检查你的服务器上的文件传输是否有效。

就像是…

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