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

Sha*_*off 307 ssh file-copy

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

Gil*_*il' 160

主连接

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

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

ControlMaster auto
ControlPath ~/.ssh/control:%h:%p:%r
Run Code Online (Sandbox Code Playgroud)

如果您将 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。有关详细信息,请参阅手册中的“转义字符”。

这个 Server Fault 线程中还有一些有趣的信息。

复制粘贴

如果文件很小,您可以输入它并从终端输出中复制粘贴。如果文件包含不可打印的字符,请使用诸如base64 之类的编码。

remote.example.net$ base64 <myfile
 (复制输出)
local.example.net$ base64 -d >myfile
 (粘贴剪贴板内容)
Ctrl +D

更方便的是,如果您启用了 X 转发,请复制远程计算机上的文件并将其粘贴到本地。您可以通过管道将数据传入和传出xclipxsel。如果要保留文件名和元数据,请复制粘贴存档。

remote.example.net$ tar -czf - myfile | xsel
Run Code Online (Sandbox Code Playgroud)

local.example.net$ xsel | tar -xzf -
Run Code Online (Sandbox Code Playgroud)

  • @Pacerier 因为 SFTP 是一种使用 SSH 传输文件的方式。 (4认同)
  • @Pacerier SFTP 有一些额外的命令,如列出文件或删除远程文件等。 (2认同)

Flo*_*ida 92

另一种(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
Run Code Online (Sandbox Code Playgroud)

或者,如果您更喜欢类似 GUI 的东西,请尝试Midnight Commander。他们称该功能为Shell-Link。大多数发行版在他们的软件包系统中都有 em 作为mc.

  • 老实说,我不明白为什么这不被赞成。OP 要求解决 _without_ scp。有时,特别是在我通过 ssh 连接到一个非常残缺的 ISP 提供的路由器的情况下,我没有 sftp,我没有 scp,甚至 ftp 也严重损坏。我知道我可以做到这一点,我来这里只是为了确保我的语法是正确的。 (9认同)
  • 实际上,这个解决方案在我的情况下不起作用。使用从 Windows 到 Linux 创建的隧道,您从腻子开始,而不是终端。这个方法正是我想要的,但我不能使用它。生气了。 (2认同)
  • 我不赞成这一点的原因是,如果客户端计算机位于共享路由器(如公司网络)后面,它将无法工作。假设我在工作计算机上,并且已经通过 ssh 连接到我的家庭服务器。如何将文件复制到我的工作计算机上,经历了通过带有空格和特殊字符的复杂目录进行 cd 的痛苦? (2认同)
  • 它适用于二进制数据。我一直在用`tgz`文件做这个:) (2认同)

Cor*_*son 57

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
Run Code Online (Sandbox Code Playgroud)

!args似乎最接近是你想要的。请注意,您需要PermitLocalCommand/etc/ssh_config文件中启用才能使~C命令起作用(请参阅 参考资料man ssh_config)。

如果您ControlMasterssh_config. 如果你这样做:

$ ~C
ssh> !scp file user@myserver:
Run Code Online (Sandbox Code Playgroud)

从技术上讲,您从未离开过 ssh 会话,也不需要重新进行身份验证。可能比您想要的更复杂,但我想不出另一种简单的方法。


小智 44

这些都是非常复杂的方法。
您可以使用以下命令在本地计算机上挂载远程文件系统sshfs

mkdir -p /mnt/sshfs

root@IS1300:~# sshfs 192.168.1.2:/ /mnt/sshfs
root@IS1300:~# umount /mnt/sshfs
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用 nautilus、gnome、konqueror、dolphin、bash 或其他工具复制粘贴该文件。

  • 使用密钥文件连接:`sshfs -oIdentityFile=~/.ssh/keyfile.pem user@192.168.1.2:/ /mnt/sshfs/` (5认同)

eph*_*ent 15

  • 使用ssh-xfer,一种经过修改的 ssh 代理,它有效地重载现有的 ssh 侧通道以用于文件传输。
  • 使用zssh,它实际上是 ssh 上的 zmodem。如果您曾经使用过 rzsz,这看起来会很熟悉。
  • 反向(-R,用于远程到本地)或转发(-L,用于本地到远程)端口来运行文件传输,假设您有一些文件传输守护程序在另一端侦听。

但这些都不是真正需要的,IMO。SSH 协议支持单个连接上的多个通道,OpenSSH 客户端支持多路复用。假设你有ControlMasterControlPath 设置ControlPersist同样是有用的)

  # 第一次连接
$ ssh 远程

  # 将在原始 ssh 打开的同一连接上进行多路复用
$ sftp 远程

  • zmodem 让我想起了从本地 BBS 下载最新的共享软件.. :-) (5认同)

小智 11

我发现最好和最有效的解决方案是使用xclip-copyfilexclip-pastefile

在服务器上,您xclip-copyfile用来复制一个或多个文件。然后这些文件在您的本地服务器上可用。在那里,您可以使用xclip-pastefile.

这绕过了使用scp或拥有本地 ssh 服务器的需要。例如,我将它与 cygwin 一起使用。唯一的问题是,xclip如果您还没有安装,则需要安装。哦,这也适用于二进制文件。


小智 10

一种更简单的方法:打开 Filezilla(或您最喜欢的 ftp 浏览器),打开到同一站点的 ssh 连接,找到该文件并将其拖到您的本地文件结构中。如果您是 Filezilla 的新手,请使用“站点管理器”功能下次快速重新连接。

是的,我知道这对你们中的大多数人来说是显而易见的(并且不完全是这样),但是一些(像我一样)发现这个线程搜索仅终端解决方案的人可能忽略了显而易见的问题。


归档时间:

查看次数:

360309 次

最近记录:

5 年,1 月 前