Linux - sh 脚本 - 从 FTP 下载多个文件

Linux - sh script - download multiple files from FTP

我需要可以通过我的 sh 代码从 ftp 下载文件的脚本

我已经将 expect 与 ftp 一起使用,但是如果我在代码中执行 for 循环,我会得到

wrong # args: should be "for start test next command" while executing "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

wget

expect 可能很难使用,所以我更愿意使用 GNU Wget 作为替代。只要您在任何参数中没有任何空格,以下内容就应该有效。

for v in "${files_to_download[@]}"
do
  ftp_file="${v}.bz2"
  wget --user=${USER} --password=${PASSWD} ${HOST}/${ftp_file}
done

仅使用一个 FTP 连接请求多个资源

如果这是一个问题,您可以通过使用 FTP globbing(通配符)来避免与服务器建立多个 FTP 连接,例如

wget --user=${USER} --password=${PASSWD} "${HOST}/*.bz2"

确保 URL 被引用,这样 shell 就不会扩展通配符。 您还可以使用 -nc, --no-clobber 选项来避免重新下载已经下载过的文件。

另一方面,请求多个资源 (wget url2 url2 ...) 会导致多次 FTP 登录。

注意:我通过在自己的FTP服务器上用tcpdump.

监控端口21检查了以上两个操作

ncftp

您可能也对 ncftp 感兴趣。虽然我已经很多年没有使用它了,但我发现它——以及它的 ncftpgetncftpput 实用程序——比标准的 UNIX ftp 程序更容易用于命令行脚本编写。