如果出现问题,我认为运行 ftp 并检查 ftp 的退出代码会更容易。
我按照下面的例子做了这个:
# ...
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
编辑: 为了捕捉错误,我 grep ftp 命令的输出。但这确实不是最好的解决方案。
我不知道您对 Perl、Python 或 Ruby 等脚本语言有多熟悉。它们都有一个可供您使用的 FTP 模块。这使您能够在每个命令之后检查错误。这是 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;
为了使这个逻辑正常工作,用户还需要从 ftp 命令重定向 STDERR,如下所示
ftp -i -n $HOST >$FTPLOG 2>&1 << EOF
下面的命令将始终分配 0(成功),因为 ftp 命令不会返回成功或失败。所以用户不应该依赖它
EXITFTP=$?