哪个是通过SSH会话将文件从远程主机引导到本地主机的最佳方法?

Nic*_*ick 14 ssh

当通过ssh连接到远程主机时,我经常想将该系统上的文件带到本地系统进行查看或处理.有没有办法复制文件而没有(a)打开一个新终端/暂停ssh会话(b)再次验证本地或远程主机工作(c)即使一个或两个主机在后面NAT路由器?

目标是利用尽可能多的当前状态:两台机器之间存在连接,我在两者上都进行了身份验证,我在文件的工作目录中 - 所以我不必打开另一个终端并复制并粘贴远程主机和路径,这就是我现在所做的.最好的解决方案也不需要在会话开始之前进行任何设置,但如果设置是一次性的或能够自动化,那么这是完全可以接受的.

Ant*_*emi 9

zssh(openssh上的ZMODEM包装器)完全符合您的要求.

  • 安装zssh并使用它而不是openssh(我假设你通常使用)

  • 您必须在两个系统上安装lrzsz软件包.

然后,将文件zyxel.png从远程传输到本地主机:

antti@local:~$ zssh remote
Press ^@ (C-Space) to enter file transfer mode, then ? for help
...
antti@remote:~$ sz zyxel.png
**B00000000000000
^@
zssh > rz
Receiving: zyxel.png
Bytes received:  104036/ 104036   BPS:16059729

Transfer complete
antti@remote:~$ 
Run Code Online (Sandbox Code Playgroud)

上传类似,只是你只需要切换rz(1)sz(1).

Putty用户可以尝试具有类似功能的Le Putty.


Nic*_*ick 0

这是我对这个问题的首选解决方案。创建 ssh 会话时设置反向 ssh 隧道。这可以通过两个 bash 函数变得容易:grabfrom() 需要在本地主机上定义,而grab() 应该在远程主机上定义。您可以添加您认为合适的任何其他 ssh 变量(例如 -X 或 -Y)。

function grabfrom() { ssh -R 2202:127.0.0.1:22 ${@}; };
function grab() { scp -P 2202 $@ localuser@127.0.0.1:~; };
Run Code Online (Sandbox Code Playgroud)

用法:

localhost% grabfrom remoteuser@remotehost
password: <remote password goes here>
remotehost% grab somefile1 somefile2 *.txt
password: <local password goes here>
Run Code Online (Sandbox Code Playgroud)

优点:

  • 除了 OpenSSH 之外,它无需任何主机上的特殊软件即可工作
  • 当本地主机位于 NAT 路由器后面时它可以工作
  • 它可以实现为一对两个单行 bash 函数

缺点:

  • 它使用固定端口号,因此:
    • 不适用于与远程主机的多个连接
    • 可能与远程主机上使用该端口的进程发生冲突
  • 它需要 localhost 接受 ssh 连接
  • 启动会话时需要特殊命令
  • 它不会隐式处理对本地主机的身份验证
  • 它不允许在本地主机上指定目标目录
  • 如果您从多个本地主机抓取到同一个远程主机,ssh 不会喜欢密钥更改

未来的工作:这仍然很糟糕。显然,可以通过适当设置 ssh 密钥来处理身份验证问题,并且通过向grab()添加参数来允许指定远程目录甚至更容易

更困难的是解决其他负面因素。最好选择一个动态端口,但据我所知,没有优雅的方法将该端口传递到远程主机上的 shell;据我所知,OpenSSH 不允许您在远程主机上设置任意环境变量,并且 bash 无法从命令行参数获取环境变量。即使您可以选择动态端口,也无法确保在不先连接的情况下它不会在远程主机上使用。