当通过ssh连接到远程主机时,我经常想将该系统上的文件带到本地系统进行查看或处理.有没有办法复制文件而没有(a)打开一个新终端/暂停ssh会话(b)再次验证本地或远程主机工作(c)即使一个或两个主机在后面NAT路由器?
目标是利用尽可能多的当前状态:两台机器之间存在连接,我在两者上都进行了身份验证,我在文件的工作目录中 - 所以我不必打开另一个终端并复制并粘贴远程主机和路径,这就是我现在所做的.最好的解决方案也不需要在会话开始之前进行任何设置,但如果设置是一次性的或能够自动化,那么这是完全可以接受的.
我创建了一个程序,它遍历一堆文件并调用其中一些文件:
scp <file> user@host:<remotefile>
Run Code Online (Sandbox Code Playgroud)
但是,在我的情况下,可能有数千个需要传输的小文件,并且scp正在为每个文件打开一个新的ssh连接,这有很多开销.
我想知道是否没有解决方案,我保持一个进程运行,维护连接,我可以发送它"请求"复制单个文件.
理想情况下,我正在寻找一些发送器和接收器程序的组合,这样我就可以在开始时启动一个进程(1):
ssh user@host receiverprogram
Run Code Online (Sandbox Code Playgroud)
对于每个文件,我调用一个命令(2):
senderprogram <file> <remotefile>
Run Code Online (Sandbox Code Playgroud)
并将(2)的输出传递给(1)的输入,这将导致文件被传输.最后,我可以发送进程(1)一些信号终止.
优选地,发送器和接收器程序是用于Unix的开源C程序.他们可以使用套接字而不是管道或任何其他创造性解决方案进行通信.
但是,在迭代它时,每个文件都被传输是一个重要的约束:收集文件列表然后调用一个实例scp在结束时一次传输所有文件是不可接受的.此外,我只有简单的shell访问接收主机.
更新:我找到了使用ssh的多路复用功能解决连接开销问题的解决方案,请参阅下面的答案.然而,我正在开始赏金,因为我很想知道是否存在我在这里描述的发送者/接收者程序.似乎应该存在可以使用的东西,例如xmodem/ymodem/zmodem?