使用 ssh 将文件复制回本地系统

使用 ssh 将文件复制回本地系统

如果我通过 SSH 登录到系统,有没有办法将文件复制回本地系统,而无需启动另一个终端或屏幕会话并执行 scp 或类似操作,或者无需从远程系统执行 SSH 回到本地系统本地系统?

答案1

主连接

如果您提前计划,这是最容易的。

第一次打开主连接。对于后续连接,通过现有主连接路由从连接。在你的~/.ssh/config,设置连接共享自动发生:

ControlMaster auto
ControlPath ~/.ssh/control:%h:%p:%r

如果您启动与现有连接相同(用户、端口、计算机)的 ssh 会话,则第二个会话将通过第一个会话进行隧道传输。建立第二个连接不需要新的身份验证,并且速度非常快。

因此,当您建立有效连接时,您可以快速:

转发

在现有连接上,您可以建立反向 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

另一种(IMO)简单的方法是:

# to remote host
cat localfile.conf | ssh user@hostname 'cat -> /tmp/remotefile.conf'

# from remote host
ssh user@hostname 'cat /tmp/remotefile.conf' > /tmp/localfile.conf

或者,如果您更喜欢类似 GUI 的东西,请尝试午夜指挥官。他们称该功能为壳牌链接。大多数发行版在其软件包系统中都将 em 作为mc.

答案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 远程

相关内容