有时,我们需要通过ftp传送文件到另一台机器。通常情况下,可以通过交互式的命令行来完成,但对于数据量较多的情况来讲,这样的操作会很烦琐。
此时,可以写一段shell/ target=_blank class=infotextkey>shell脚本,实现ftp文件的自动传输即可。
可能的问题
在shell脚本中用FTP传输文件,会要求输入密码才可能操作ftp服务器。
典型的FTP客户端程序在Unix,linux,Solaris和NetBSD系统中,会从/dev/tty终端接收FTP密码。
来看一个例子,用于演示:
#!/bin/sh
HOST='ftp.users.jb200.com'
USER='yourid'
PASSWD='yourpw'
FILE='file.txt'
ftp $HOST <<END_SCRIPT
user $USER
$PASSWD
put $FILE
quit
END_SCRIPT
exit 0
以上脚本只是挂在前台(在xterm)运行,或在后台运行(以cron作业运行),它未能实现file.txt的转移工作。
实际应用中的例子:
#!/bin/sh
HOST='ftp.users.jb200.com'
USER='yourid'
PASSWD='yourpw'
FILE='file.txt'
ftp -n $HOST <<END_SCRIPT
quote USER $USER
quote PASS $PASSWD
put $FILE
quit
END_SCRIPT
exit 0
技巧
ftp客户端程序,获取FTP服务器的密码,而无需读取密码从/dev/tty的需要两个技巧:
FTP客户端程序,以防止FTP客户端试图登录,请使用-n选项。
这样,便不会谗ftp客户端的用户ID和密码。且不使用/dev/tty。
在脚本中将用户ID和密码发送到FTP服务器的ftp客户端程序中,来完成ftp的自动连接与登录。
提高
以上脚本在运行时,会输出很多信息,有时我们并不希望这样,可以这样操作:
通过作用于FTP客户端程序的退出状态,可以进一步细化误处理
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
大量的ftp文件传输,尤其是大文件的传输,会消耗很多时间。
此时,就可以考虑用我们今天介绍的shell脚本,来实现ftp文件的可控传输。
希望本文的介绍,对大家在shell中使用ftp操作文件方面,有一定的帮助。