【问题标题】:Bash script: Looping through directories over SSH and downloading them to local machineBash 脚本:通过 SSH 遍历目录并将它们下载到本地计算机
【发布时间】:2016-07-21 22:42:02
【问题描述】:

我正在尝试编写一个 bash 脚本:

  • 通过 SSH 服务器遍历文件夹中的所有目录
  • 将每个文件夹中的文件(名为“foo”)下载到本地计算机。

目前,我有:

ssh username@server "for dir in ~/directoryname/*; (... something here!); done"

但是,我认为在访问 SSH 服务器时不能使用 scp。有没有办法让我在这里循环并下载所有内容?

【问题讨论】:

  • 在另一个网络上复制:unix.stackexchange.com/questions/107122/…
  • 仅供参考,StackSnippets 仅适用于 HTML 和 JavaScript。对于常规代码格式,请使用{} 按钮。
  • 谢谢,@CharlesDuffy,我很感激。

标签: linux bash ssh scp


【解决方案1】:

仅当远程服务器有权访问您自己的系统时,远程运行scp 才有效。让我们假设它没有。

您可以分两步完成:

ssh username@server "... some script that just echos the paths ..." > log
for line in $(<log); do scp username@server:$line ./dir/$line; done

或者你可以调查一下rsync,它非常强大。它有 --include--exclude 选项,可以让您执行以下操作:

rsync -av username@server:~/somepath/ ./somepath/ [--exclude/--include flags]

【讨论】:

  • 另一种常见的模式是管道压缩包。 ssh "$server" 'tar -C /source/directory-name .' | tar -C /dest/directory-name -x.
  • 顺便说一句,for line in $(&lt;log) 有问题。请改用 BashFAQ #1 模式 (mywiki.wooledge.org/BashFAQ/001)。否则,您将遇到带有空格的文件名、带有全局文字的文件名等问题。
  • (另外,每个文件一个 scp 实例效率极低——对于任何大量文件,至少希望使用 ControlMaster 重用单个连接;参见 en.wikibooks.org/wiki/OpenSSH/Cookbook/Multiplexing
  • (对于管道压缩包方法,tar 可以接受标准输入上的文件列表,因此可以使用find 中的逻辑等进行过滤)。
  • 我完全了解我发布的 sn-ps 在外壳方面和性能方面的注意事项。他的要求似乎是一个肮脏的一次性的,不需要保留。
【解决方案2】:

是的,该脚本是传递给 ssh 的参数,并且在远程机器上运行,这意味着您不能轻易引用自己的机器来告诉它要将文件复制到哪里。

您可以尝试在本地运行的 bash 脚本来获取您正在搜索的目录结构,并使用 scp 复制您有兴趣检索的任何内容。

或者,根据所涉及的大小,对所有 directoryname/ 进行 scp,然后从那里得到你想要的。

【讨论】:

    猜你喜欢
    • 2011-05-11
    • 2017-02-22
    • 1970-01-01
    • 2013-03-24
    • 2017-08-01
    • 2011-12-27
    • 1970-01-01
    • 1970-01-01
    • 2016-03-27
    相关资源
    最近更新 更多