在shell脚本中使用ftp的方法分享

发布时间:2019-11-11编辑:脚本学堂
本文介绍下,在linux中使用shell脚本进行ftp上传、下载操作的方法,通过具体的例子,帮助大家学习与理解。

有时,我们需要通过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 -n $HOST > /tmp/ftp.worked 2> /tmp/ftp.failed <<END_SCRIPT

通过作用于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操作文件方面,有一定的帮助。