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

标签 linux ftp sh

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

我用过expect使用 ftp,但是如果我在代码中进行循环,我得到了

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 登录。

注意:我通过使用tcpdump 监控我自己的 FTP 服务器上的端口 21 来检查上述两个操作。

网络传输协议(protocol)

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

关于Linux - sh 脚本 - 从 FTP 下载多个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30841958/

相关文章:

java - 如何使用java从ftp服务器下载文件到本地计算机

linux - 如何使用斜杠修改配置参数值

Linux Glob 模式删除所有包含 '?' 的文件?

c - inotify C 头文件

bash - FTP 删除早于 X 天的目录

Linux Shell 脚本 - 带通配符的字符串比较

bash - 生成进程的 shell 脚本,在 SIGTERM 上终止子进程

linux - 如何在 linux bash 脚本中用 "-"char (dash) 声明变量名

linux - Grep 命令 Linux 源字符串和目标字符串的排序

java - FtpRemoteFileTemplate 检查远程文件是否存在但无法检索它