当通过ssh连接到远程主机时,我经常想将该系统上的文件带到本地系统进行查看或处理.有没有办法复制文件而没有(a)打开一个新终端/暂停ssh会话(b)再次验证本地或远程主机工作(c)即使一个或两个主机在后面NAT路由器?
目标是利用尽可能多的当前状态:两台机器之间存在连接,我在两者上都进行了身份验证,我在文件的工作目录中 - 所以我不必打开另一个终端并复制并粘贴远程主机和路径,这就是我现在所做的.最好的解决方案也不需要在会话开始之前进行任何设置,但如果设置是一次性的或能够自动化,那么这是完全可以接受的.
zssh(openssh上的ZMODEM包装器)完全符合您的要求.
然后,将文件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)
Putty用户可以尝试具有类似功能的Le Putty.
这是我对这个问题的首选解决方案。创建 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)
优点:
缺点:
未来的工作:这仍然很糟糕。显然,可以通过适当设置 ssh 密钥来处理身份验证问题,并且通过向grab()添加参数来允许指定远程目录甚至更容易
更困难的是解决其他负面因素。最好选择一个动态端口,但据我所知,没有优雅的方法将该端口传递到远程主机上的 shell;据我所知,OpenSSH 不允许您在远程主机上设置任意环境变量,并且 bash 无法从命令行参数获取环境变量。即使您可以选择动态端口,也无法确保在不先连接的情况下它不会在远程主机上使用。
归档时间: |
|
查看次数: |
2578 次 |
最近记录: |