如果我通过 SSH 登录到系统,有没有办法将文件复制回本地系统,而无需启动另一个终端或屏幕会话并执行 scp 或类似操作,或者无需从远程系统执行 SSH 回到本地系统本地系统?
答案1
主连接
如果您提前计划,这是最容易的。
第一次打开主连接。对于后续连接,通过现有主连接路由从连接。在你的~/.ssh/config
,设置连接共享自动发生:
ControlMaster auto
ControlPath ~/.ssh/control:%h:%p:%r
如果您启动与现有连接相同(用户、端口、计算机)的 ssh 会话,则第二个会话将通过第一个会话进行隧道传输。建立第二个连接不需要新的身份验证,并且速度非常快。
因此,当您建立有效连接时,您可以快速:
scp
使用或复制文件rsync
;- 使用 sshfs 挂载远程文件系统。
转发
在现有连接上,您可以建立反向 ssh 隧道。在 ssh 命令行上,通过传递来创建远程转发,-R 22042:localhost:22
其中 22042 是随机选择的数字,该数字不同于远程计算机上的任何其他端口号。然后ssh -p 22042 localhost
在远程计算机上将您连接回源计算机;您可以用来scp -P 22042 foo localhost:
复制文件。
您可以使用 进一步自动化此操作RemoteForward 22042 localhost:22
。这样做的问题是,如果您使用多个 ssh 实例连接到同一台计算机,或者其他人正在使用该端口,您将无法获得转发。
如果您从一开始就没有启用远程转发,则可以在现有的 ssh 会话上执行此操作。类型Enter ~C
Enter -R 22042:localhost:22
Enter。有关详细信息,请参阅手册中的“转义字符”。
其中还有一些有趣的信息这个服务器故障线程。
复制粘贴
如果文件很小,您可以将其键入并从终端输出中复制粘贴。如果文件包含不可打印的字符,请使用诸如64位基数。
remote.example.net$ base64 <myfile (复制输出)
local.example.net$ base64 -d >myfile (粘贴剪贴板内容) Ctrl+D
更方便的是,如果您启用了 X 转发,请将文件复制到远程计算机上并将其粘贴到本地。您可以通过管道传入和传出数据xclip
或者xsel
。如果要保留文件名和元数据,请复制粘贴存档。
remote.example.net$ tar -czf - myfile | xsel
local.example.net$ xsel | tar -xzf -
答案2
答案3
~
SSH 通过转义字符(默认情况下)支持一些命令:
$ ~?
Supported escape sequences:
~. - terminate connection (and any multiplexed sessions)
~B - send a BREAK to the remote system
~C - open a command line
~R - Request rekey (SSH protocol 2 only)
~^Z - suspend ssh
~# - list forwarded connections
~& - background ssh (when waiting for connections to terminate)
~? - this message
~~ - send the escape character by typing it twice
(Note that escapes are only recognized immediately after newline.)
$ ~C
ssh> help
Commands:
-L[bind_address:]port:host:hostport Request local forward
-R[bind_address:]port:host:hostport Request remote forward
-D[bind_address:]port Request dynamic forward
-KR[bind_address:]port Cancel remote forward
!args Execute local command
这!args
似乎最接近你想要的。请注意,您需要PermitLocalCommand
在/etc/ssh_config
文件中启用这些命令才能~C
工作(请参阅 参考资料man ssh_config
)。
ControlMaster
如果您设置了in ,则可以重复使用相同的 ssh 会话ssh_config
。如果你这样做:
$ ~C
ssh> !scp file user@myserver:
从技术上讲,您从未离开过 ssh 会话,并且不需要重新进行身份验证。可能比你想要的更复杂,但我想不出另一种简单的方法。
答案4
- 使用ssh-xfer,一个经过修改的 ssh 代理,它可以有效地使现有的 ssh 侧通道超载以供文件传输使用。
- 使用泽斯什,这实际上是 ssh 上的 zmodem。如果您曾经使用过 rzsz,这看起来会非常熟悉。
- 反向(
-R
,对于远程到本地)或正向(-L
,对于本地到远程)端口运行文件传输,假设您有一些文件传输守护进程在另一端侦听。
但在我看来,这些都不是真正需要的。 SSH 协议支持单个连接上的多个通道,并且 OpenSSH 客户端支持多路复用。假设你有ControlMaster
并且ControlPath
设置(ControlPersist
也很有用),
# 第一次连接 $ ssh 远程 # 将在原始 ssh 打开的同一连接上进行多路复用 $ sftp 远程