【问题标题】:How to do file transfer inside ssh command line?如何在 ssh 命令行中进行文件传输?
【发布时间】:2015-09-10 11:11:48
【问题描述】:

我必须将文件从服务器 A 传输到 B,然后需要在服务器 B 上触发脚本。服务器 B 是负载平衡服务器,它将重定向我们不知道的服务器 B1 或 B2。

我已经实现了如下。

sftp user@Server
put file
exit

然后执行下面的代码来触发目标脚本

ssh user@Server "script.sh"

但是这里的问题是正如我所说的它是一个负载平衡服务器,有时我将文件放在一个服务器中,而脚本在另一台服务器中获取触发器。如何克服这个问题?

我正在考虑以下一些解决方案

ssh user@server "Command for sftp; sh script.sh"

(即)在同一个服务器调用中,如果我放置并触发它不会给我上述问题。如何在 ssh 连接中执行 sftp?否则还有其他建议吗?

【问题讨论】:

    标签: linux shell ssh sftp aix


    【解决方案1】:

    您可以先使用 scp 命令上传文件,然后通过 ssh 调用远程命令。

    $ scp filename user@machine:/path/to/file && ssh user@machine 'bash -s' < script.sh

    这个例子是上传本地文件,但是在服务器A上运行没有问题。

    【讨论】:

    • 当我们执行 scp 拳头时,它是第一次尝试服务器,当我们第二次执行 ssh 时,它是另一个连接。所以它并不总是去同一个服务器。
    【解决方案2】:

    如果你只是复制一个文件然后执行一个脚本,它不能作为两个单独的命令发生,你可以这样做:

    gzip -c srcfile | ssh user@remote 'gunzip -c >destfile; script.sh'
    

    这个gzips srcfile,通过ssh发送到远端,gunzips在那边,然后执行script.sh

    如果你想要多个文件,你可以使用tar而不是gzip:

    tar czf - <srcfiles> | ssh user@remote 'tar xzf -; script.sh'
    

    如果你想从远程端取回结果并且它们是文件,你可以在脚本之后复制 tar…

    tar czf - <srcfiles> | ssh user@remote 'tar xzf -; script.sh; tar czf - <remotedatafiles>' | tar xzf -
    

    即创建一个从 ssh 回到本地环境的新管道。这仅在script.sh 不生成任何输出时才有效。如果它生成输出,您必须将其重定向,例如到 /dev/null 以防止它弄乱 tar:

    tar czf - <srcfiles> | ssh user@remote 'tar xzf -; script.sh >/dev/null; tar czf - <remotedatafiles>' | tar xzf -
    

    【讨论】:

    • 水晶透明。谢谢。
    • 如果我想传输目录中的所有文件,我该如何更改上述代码? gzip -r 单独压缩所有文件,而不是单独压缩。
    • 在这种情况下,您可以使用 tar - tar czf - &lt;files/dir&gt; | ssh user@host 'tar xzf -; script.sh 之类的东西。如果要指定目标目录,请添加 -C &lt;destdir&gt; 例如tar xzf - -C &lt;destdir&gt;
    • 谢谢,现在很好。另一个问题是在远程站点执行脚本后,我需要从那里提取一些数据。是否可以在同一个连接中?
    • 如果脚本没有产生任何输出,那么您可以简单地执行:tar czf - &lt;srcfiles&gt; | ssh user@remote 'tar xzf -; script.sh; tar czf - &lt;remotedatafiles&gt;' | tar xzf -。我已经用更多细节更新了答案
    【解决方案3】:

    您可以在服务器上创建一个 fifo(命名管道),并启动一个尝试从中读取的程序。该程序将阻塞,它不会占用任何 CPU。

    从 sftp 尝试写入管道 -- 你确实会失败,但监听程序会运行,并检查上传的文件。

    # ls -l /home/inp/alertme
    prw------- 1 inp system 0 Mar 27 16:05 /home/inp/alertme
    # date; cat /home/inp/alertme; date
    Wed Jun 24 12:07:20 CEST 2015
    <waiting for 'put'>
    Wed Jun 24 12:08:19 CEST 2015
    

    【讨论】:

      【解决方案4】:

      传输测试用 tar gzip 压缩,ssh 默认压缩。使用 PV 作为管道流量计 (apt-get install pv) 在一些站点文件夹上进行测试,其中大约有 80k 个小图像,文件夹的总大小约为 1.9Gb 使用非标准 ssh-port 2204

      1) tar gzip,无 ssh 压缩

      tar cpfz - site.com|pv -b -a -t|ssh -p 2204 -o cipher=none root@removeip "tar xfz - -C /destination/"
      

      光伏计量器从 4Mb/秒开始,到最后降到 1.2MB/秒。 PV 显示大约 1.3Gb 传输字节(文件夹总大小为 1.9GB)

      2) tar nozip、ssh 压缩:

      tar cpf - site.com|pv -b -a -t|ssh -p 2204 root@removeip "tar xf - -C /destination/"
      

      光伏仪表从 8-9Mb/秒开始,到最后降到 1.8Mb/秒

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-24
        • 2013-01-31
        • 2013-10-15
        • 2014-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-07
        相关资源
        最近更新 更多