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


257

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


4
如果您的客户端上有SSH服务器,则可以随时尝试scp file.foo user@myclient.com:file.foo:P
rahmu

4
当然可以,但是我不想允许我所工作的公司拥有的服务器访问我的计算机:)无论如何,我这里仅具有基于密钥的身份验证,并且放置私钥也不是太安全。在服务器上!
Naftuli Kay 2011

2
我不明白你的问题。生成一个新的密钥对,将公共部分复制到您的计算机authorized_keys,并在传输后再次删除该行。
尼尔斯

8
我做了很多事情,所以每次我想在SSH会话中间复制文件时,这样做的效率都会很低。我只是在寻找一种方法,在SSH终端会话中,可以挂接到我的本地计算机,并让它向远程服务器发送文件,而不必离开当前的SSH会话。
Naftuli Kay 2011

2
问题在于,最初的ssh登录可能会很痛苦(2fa或其他超出密钥或密码的挑战),我们可能没有priv来更改ssh服务器的配置,没有理由必须多次进行密钥协商,并且一旦我们有了一个会话,最好将该会话用于多方面。
duanev

Answers:


139

主连接

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

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

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

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

因此,在建立活动连接的同时,您可以快速:

转寄

在现有连接上,可以建立反向ssh隧道。在ssh命令行上,通过传递-R 22042:localhost:2222042是一个随机选择的数字来创建远程转发,该数字不同于远程计算机上的任何其他端口号。然后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 -

如果我们可以使用SSH传输文件,为什么人们仍然需要/使用SFTP?
Pacerier,2014年

3
@Pacerier因为SFTP是使用SSH传输文件的一种方式。
吉尔斯2014年

如果人们可以使用不带SFTP的SSH传输文件,为什么甚至需要SFTP?
Pacerier,2014年

复制粘贴方法对于链式连接(即跳过多个主机以到达最后一个主机)特别方便
golimar 2015年

1
@Pacerier SFTP具有一些额外的命令,例如列表文件或删除远程文件等
。– rahmu

67

另一种(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的东西,请尝试Midnight Commander。他们称此功能为Shell-Link。大多数发行版的软件包系统中都包含em mc


8
老实说,我不明白为什么这个不赞成。OP要求没有 scp 的解决方案。有时,尤其是在我将ssh插入非常残缺的ISP提供的路由器的情况下,我没有sftp,没有scp,甚至ftp严重损坏。我知道我可以做到这一点,我只是来这里确保我的语法正确。
Auspex

1
辉煌!mc是最快使用的。
Namek

2
实际上,这种解决方案不适用于我。使用从Windows到Linux创建的隧道,您可以从腻子而不是终端开始。该方法正是我想要的,但是我不能使用它。懊恼。
本杰明

1
我不赞成这样做的原因是,如果客户端计算机位于共享路由器(例如公司网络)后面,则它将无法正常工作。假设我在工作计算机上,并且已经进入家用服务器。我已经经历了用空格和特殊字符在复杂目录中进行cd的痛苦,如何将文件复制到我的工作计算机?
Sridhar Sarnobat

1
它可以很好地处理二进制数据。我一直在处理tgz文件:)
Florian Fida

53

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)。

如果你设置了一个可以重新使用相同的SSH会话ControlMasterssh_config。如果您这样做:

$ ~C
ssh> !scp file user@myserver:

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


这仍然有效吗?我!args在帮助消息中找不到。
xuhdev '16

@xuhdev它仍然存在于OpenSSH_7.2p2上,args不在第一条帮助消息(~?)中,而是在第二条中(一旦输入出现ssh>提示~C,可以helpssh>提示符下键入)
sdaau

这看起来是一个很好的解决方案(尽管我还没有尝试过),但我没有意识到您可以获取vim风格的父命令行缓冲区。在实践中,可能只是喜欢打开一个新的终端选项卡,以使他们不会忘记如何返回会话(例如,当我永远不记得如何退出emacs时)。
Sridhar Sarnobat

37

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

mkdir -p /mnt/sshfs

root@IS1300:~# sshfs 192.168.1.2:/ /mnt/sshfs
root@IS1300:~# umount /mnt/sshfs

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


4
连接密钥文件:sshfs -oIdentityFile=~/.ssh/keyfile.pem user@192.168.1.2:/ /mnt/sshfs/
sshow

15
  • 使用ssh-xfer(一种经过修改的ssh-agent),可以有效地重载现有的ssh辅助通道以进行文件传输。
  • 使用zssh,它实际上是ssh的zmodem。如果您曾经使用过rzsz,这似乎非常熟悉。
  • 反向(-R,对于远程到本地)或前进(-L,对于本地到远程)端口,以运行文件传输,前提是您在另一端监听了某些文件传输守护程序。

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

  #第一次连接
$ ssh远程

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

5
zmodem让我想起了从本地BBS下载最新共享软件的情况。:-)
Stuart Woodward 2013年

xfer方式正是我在寻找的方式,但是您知道为什么OpenSSH上游不包含ssh-xfer补丁吗?有火焰吗?
Ferran Basora 2015年

感谢您的zssh提示!我在Konsole中使用tmux,并且由于tmux,服务器的“ sz”不再起作用。zssh解决了我的问题!
0xAF

9

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

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


是的,或者按此处建议的sftp
原子

我相信FileZilla服务器仅Windows。客户虽然跨平台
Freedom_Ben

您甚至可以使用Caja,只需打开即可ssh://SERVER
basic6

8

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

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

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


哇,这可能比我的反向端口转发加netcat更好的解决方案。
Sridhar Sarnobat

3

尽管使用实用的开源软件,但我们使用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“ d tarball 发送到精简的远程系统,以便可以将ZModem文件发送给它。)

  • SFTP -SecureCRT具有紧密集成的基本SFTP实现。

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

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

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

    该SFTP功能具有基本的命令行界面,sftp类似于OpenSSH的程序,但它具有诸如Tab命令完成之类的功能。因此,检索称为的远程文件somefile.tar.gz可能很容易get soTabEnter

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

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

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

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

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


1

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.