题
我目前正在创建一个过夜的工作,呼吁Unix脚本,这反过来将创建和转移文件使用 ftp
.我想检查所有可能的返回代码。人页 ftp
没有列出返回代码。任何人都不会知道在哪里可以找到一个清单?任何人都有经验吗?我们还有其他的脚本,即查询对于某些回串在日志中,他们发送电子邮件时,在错误。然而,他们往往错过意料之外的代码。我然后把原因进入日志和电子邮件。
解决方案
在我遇到的大多数实现中, ftp
命令不会返回除零之外的任何内容。
在日志中处理三位数代码要好得多 - 如果您要发送二进制文件,则可以检查发送的字节是否正确。
三位数代码称为“系列代码”,可以在此处找到一个列表一>
其他提示
我编写了一个脚本,一次只传输一个文件,并在该脚本中使用 grep
来检查 226传输完成
消息。如果找到它, grep
将返回0.
ftp -niv < "$2"_ftp.tmp | grep "^226 "
我认为运行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=$?
蹩脚的回答我知道,但是如何获取ftp源并自己查看
我喜欢Anurag的解决方案,因为字节传输问题我用grep -v&quot; bytes&quot;
扩展了命令即
grep&quot; ^ 530&quot; ftp_out2.txt | grep -v&quot; byte&quot;
- 而不是530,你可以使用Anurag所做的所有错误代码。
你说你想FTP的文件有,但你没说是否定期BSD FTP客户只有这样,你想得到它。BSD FTP不会给你一个返回代码错误情况需要所有分析,而是有一整个系列的其他Unix程序,可以用来传输文件的通过FTP如果你或你的管理员将安装他们。我会给你一些例子方式传送文件的通过FTP同时仍然捕获所有的错误的条件有很少量的代码。
FTPUSER是你的ftp用户的登录名
FTPPASS是你的ftp密码
文件的地方你想要的文件上载,没有任何道路的信息(例如:file1.txt不/whatever/file1.txt 或whatever/file1.txt
FTPHOST是远程机器你想FTP
REMOTEDIR是一个绝对的道路上的位置远程机器你想上传到
这里是实例:
卷--user$FTPUSER:$FTPPASS-T$文件ftp://$FTPHOST/%2f$REMOTEDIR
ftp upload--主$FTPHOST--user$FTPUSER--password$FTPPASS--美元REMOTEDIR/$FILE$文件
tnftp-u ftp://$FTPUSER:$FTPPASS@$FTPHOST/%2f$REMOTEDIR/$FILE$文件
wput$文件ftp://$FTPUSER:$FTPPASS@$FTPHOST/%2f$REMOTEDIR/$FILE
所有这些方案将返回一个非零退出的代码如果任何事情都出错,沿着与文字表示什么失败。你可以测试这个,然后做任何你想要的输出,记录、电子邮件等因为你希望。
请注意以下几点是:
"%2f"是用于在网址以表明以下路径是一个绝对的道路上的远程机器。然而,如果FTP服务器chroots你,你不能绕过这一点。
为命令上所述,使用一个实际的网址(ftp://etc)服务器的与用户和密码嵌入其中,用户名和密码必须网址的编码,如果它包含特殊字符。
在某些情况下可以是灵活与远程目录是绝对的和当地的文件只是普通的文件一旦你熟悉的语法中的每一程序。你可能只需要添加一个当地目录的环境变,或只是硬编码的一切。
如果你真的,绝对必须使用的经常FTP客户,一个办法你可以测试失败,在你的脚本,包括第一个命令,该命令提出的文件,接着由另一个不会得到同一文件的返回,它在不同的名称。后FTP出口,只是测试是否存在下载的文件在您脚本,或者甚至校验和它对原来以确保其传送正确的。是的,发臭,但在我看来,这是更好的代码就是易于读取比吨的分析每一个可能的错误的条件。BSD FTP只是不是所有的伟大。
这是我最终选择的内容。谢谢你的帮助。所有答案都有助于我朝着正确的方向前进。 它可能有点矫枉过正,检查结果和日志,但它应涵盖所有基础。
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
为什么不将命令的所有输出存储到日志文件中,然后检查命令的返回码,如果不是0,则在电子邮件中发送日志文件?