我需要可以通过我的sh代码从ftp下载文件的脚本
我使用了expect
和ftp,但是如果我在代码中使用循环,我得到了
错误#args:应该是“for start test next command” 同时执行“for v in”a b c“”
我的代码
/usr/bin/expect << EXCEPT_SCRIPT
set timeout 1
spawn ftp -n ${HOST}
send "user ${USER} ${PASSWD}\n"
expect "ftp>"
send "bin\n"
expect "ftp>"
send "dir\n"
for v in "${files_to_download[@]}"
do
ftp_file="${v}.bz2"
#download file
echo ${ftp_file}
#put code to dl here
done
expect "ftp>"
send "bye\n"
EXCEPT_SCRIPT
答案 0 :(得分:2)
expect
可能很难处理,因此我更倾向于使用GNU Wget作为替代方案。只要您在任何参数中没有任何空格,以下内容就可以正常工作。
for v in "${files_to_download[@]}"
do
ftp_file="${v}.bz2"
wget --user=${USER} --password=${PASSWD} ${HOST}/${ftp_file}
done
如果这是一个问题,您可以避免使用 FTP globbing (通配符)与服务器建立多个FTP连接,例如
wget --user=${USER} --password=${PASSWD} "${HOST}/*.bz2"
确保引用了URL,因此shell不会展开通配符。
您还可以使用-nc, --no-clobber
选项来避免重新下载已下载的文件。
另一方面,请求多个资源(wget url2 url2 ...
) 会导致多个FTP登录。
注意:我通过使用tcpdump
在我自己的FTP服务器上监控端口21来检查上述两个操作。
您可能也对ncftp感兴趣。虽然我多年没有使用它,但我发现它 - 以及它的ncftpget
和ncftpput
实用程序 - 比标准的UNIX ftp
程序更容易用于命令行脚本。