it-swarm.cn

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

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

271
Shawn J. Goff

主站连接

如果您事先计划,这是最简单的。

第一次打开主连接。对于后续连接,请通过现有的主连接路由从属连接。在您的 ~/.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。有关更多信息,请参见手册中的“转义符”。

此服务器故障线程 中也有一些有趣的信息。

复制粘贴

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

 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 -
144

另一种(IMO)简便方法是:

# to remote Host
cat localfile.conf | ssh [email protected] 'cat -> /tmp/remotefile.conf'

# from remote Host
ssh [email protected] 'cat /tmp/remotefile.conf' > /tmp/localfile.conf

或者,如果您喜欢类似GUI的内容,请尝试 Midnight Commander 。他们称此功能为Shell-Link。大多数发行版的软件包系统中都包含mc

75
Florian Fida

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似乎最接近您想要的。请注意,您需要在/etc/ssh_config文件中启用PermitLocalCommand,才能使~C命令起作用(请参阅man ssh_config)。

如果在ssh_config中设置ControlMaster,则可以重复使用相同的ssh会话。如果您这样做:

$ ~C
ssh> !scp file [email protected]:

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

54
Corey Henderson

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

mkdir -p /mnt/sshfs

[email protected]:~# sshfs 192.168.1.2:/ /mnt/sshfs
[email protected]:~# umount /mnt/sshfs

然后,您可以使用鹦鹉螺,gnome,konqueror,海豚,bash或其他文件复制粘贴文件。

38
Quandary
  • 使用 ssh-xfer ,这是一种经过修改的ssh-agent,可以有效地使现有ssh副通道超载,以进行文件传输。
  • 使用 zssh ,这实际上是ssh的zmodem。如果您曾经使用过rzsz,这似乎非常熟悉。
  • 逆转 (-R,用于远程到本地)或转发(-L,以便本地到远程)端口运行文件传输,假设您在另一端监听了一些文件传输守护程序。

但是,IMO并不需要这些。 SSH协议在单个连接上支持多个通道,而OpenSSH客户端支持多路复用。假设您有ControlMasterControlPath设置ControlPersist也很有用),

#第一次连接
 $ ssh remote 
 
 #将在原始ssh打开的同一连接上多路复用
 $ sftp remote 
15
ephemient

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

是的,我知道这对你们大多数人来说都是显而易见的(并非准确地说是对的),但是发现该线程在寻找仅终端解决方案的线程的某些人(像我一样)可能已经忽略了这一点。

9
Larry Jones

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

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

这样就无需使用scp或具有本地ssh服务器。例如,我将其与cygwin一起使用。唯一的问题是,如果您尚未安装xclip,则需要安装它。哦,这也适用于二进制文件。

8
Robert

我们使用 SecureCRT 的许多原因之一-尽管在可行的情况下更喜欢使用开源软件-还是文件传输容易。在F/OSS世界中,没有直接替代方法。

SecureCRT始于1990年代中期,最初是纯Windows程序,但后来移植到Mac OS X和Linux 几年前

SecureCRT具有三项主要功能,可用于将文件与SSH传输至系统或从中传输文件:

  • ZModemYModemXModemKermit 和ASCII)-SecureCRT是一门老派一种终端仿真器,支持几种带内文件传输协议。

    最容易使用的是ZModem。在远程命令行上键入sz file-to-download之类的内容时,远程sz程序会写出 转义序列 ,告诉SecureCRT立即开始将file-to-download下载到默认下载目录。

    不错的一点是,下载目录可按会话自定义。我们使用它在主办公室文件服务器上具有按站点的目录,因此我们不必手动对下载的文件进行排序。

    sz是“ send ZModem”程序,是 lrzsz 程序包的一部分。它已经为大多数Unixy系统打包。如果由于某种原因您的远程系统尚未安装它,那么您将不容易安装二进制程序包,源程序包又小又可移植。我不得不不止一次地向精简版远程系统发送lrzsz“ sharchive”uuencode'tarball 我可以将ZModem文件添加到其中。)

  • [〜#〜] sftp [〜#〜]-SecureCRT具有紧密集成的基本SFTP实现。

    所谓“紧密集成”,是指当您提供SFTP菜单命令或键盘快捷键时,它会打开一个通过同一SSH连接连接到远程站点的新选项卡。因此,您无需重新登录,并且建立连接的速度比您打开与同一服务器的单独SFTP连接的速度要快一些。

    我将SFTP功能描述为“基本”,因为VanDyke软件具有单独的文件传输产品 SecureFX 。它比内置的SFTP客户端功能更强大,并且还与SecureCRT集成。

    SecureCRT的SFTP功能使您可以配置与ZModem配置分开的默认远程目录和本地目录。

    SFTP功能具有基本的命令行界面,类似于OpenSSH的sftp程序,但它具有以下功能: Tab 命令完成。因此,检索名为somefile.tar.gz的远程文件可能和get so一样容易。TabEnter

  • 拖放-如果将文件拖放到终端窗口,它将自动为您键入rz并开始发送文件。

    或者,您可以打开SFTP选项卡并将文件拖放到该选项卡上以通过SFTP发送文件。因此,将文件发送到远程系统可能很简单 Alt-P拖放拖放

    我们发现通过SFTP进行传输的速度要快得多,可能是因为它是基于TCP的协议,因此它得益于 滑动窗口TCP/IP堆栈 )的巨大优势。 64 kiB的块大小被认为是“大”的。因此,当两端等待块传输确认时,ZModem中会吸收链接中的许多潜在速度。

    关于拖放操作模式的一件好事是,它消除了使用ZModem带来的压力之一。在远程系统上键入rz时,SecureCRT会自动弹出一个文件选择器。在远端超时之前,您大约有一分钟的时间来查找和选择文件。这会产生不愉快的反对比赛的氛围。拖放功能使您可以在闲暇时找到文件,然后通过快速单击鼠标就可以开始传输。

    我们仍然使用手动方法,使用显式的rz命令开始传输。这是因为SecureCRT允许您配置每个会话的上载目录,该目录指向文件服务器上的文件夹,该文件夹始终包含特定远程站点正在运行的软件的最新版本。对于此类传输,没有时间争用,因为文件选择器在正确的位置开始。

3
Warren Young

采用 ”!”将文件转换为文件的ASCII表示形式(例如! uuencode myfile.bin >uuencode.dat)。然后使用! cat uuencode.dat >target.dat。之后,在目标端使用uudecode:! uudecode target.dat >myfile.bin

1
Nils