如何在 ssh 命令行中进行文件传输?

How to do file transfer inside ssh command line?

我必须将一个文件从服务器 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?否则还有其他建议吗?

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

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

本例为上传本地文件,运行服务器A上没有问题

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

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

这个gzips srcfile,通过ssh发送到远端,gunzip在那边,然后执行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 -

您可以在服务器上创建一个 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

传输测试 tar gzip 压缩,ssh 默认压缩。使用 PV 作为管道仪表(apt-get install pv) 在一些站点文件夹上进行测试,其中约有 80k 小图像,文件夹总大小约为 1.9Gb 使用非标准 ssh 端口 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/"

pv meter star从 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/"

pv meter star从 8-9Mb/秒开始,最后降级到 1.8Mb/秒