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

评论

如果客户端上有ssh服务器,则可以随时尝试使用scp file.foo user@myclient.com:file.foo:P

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

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

我做了很多事情,所以每次我想在SSH会话中间复制文件时,这样做的效率都会很低。我只是在寻找一种方法,在SSH终端会话中,可以挂接到我的本地计算机,并使其无需离开当前SSH会话即可将文件发送到远程服务器。

问题在于,最初的ssh登录可能会很痛苦(2fa或键或密码之外的其他挑战),我们可能没有priv来更改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会话上进行。类型输入~C输入-R 22042:localhost:22输入。
有关更多信息,请参见手册中的“转义字符”。

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

复制粘贴

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

remote.example.net$ base64 <myfile
(copy the output)


local.example.net$ base64 -d >myfile
(paste the clipboard contents)
Ctrl+D


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

remote.example.net$ tar -czf - myfile | xsel





local.example.net$ xsel | tar -xzf -


评论


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

–起搏器
2014年10月31日15:55



@Pacerier因为SFTP是使用SSH传输文件的一种方式。

–吉尔斯'所以-不再是邪恶的'
2014年10月31日下午16:05

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

–起搏器
2014年10月31日在22:23

复制粘贴方法对于链式连接(即跳过几台主机到达最后一台主机)特别方便

– golimar
2015年10月7日14:13

@Pacerier SFTP还有一些其他命令,例如列表文件或删除远程文件等。

– rahmu
18年2月24日在21:22

#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的东西,请尝试Midnight Commander。他们称此功能为Shell-Link。大多数发行版的软件包系统中都将它们表示为mc

评论


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

–澳大利亚
16年1月13日在21:13



辉煌! mc是使用最快的。

– Namek
16 Mar 9 '16 at 10:37

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

–本杰明
17年5月15日在16:37

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

– Sridhar Sarnobat
18年4月2日,0:43



它可以很好地处理二进制数据。我一直在用tgz文件来做这个:)

–弗洛里安·菲达(Florian Fida)
19年6月6日19:19

#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,则可以重新使用相同的ssh会话。在ssh_config中。如果您这样做:

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


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

评论


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

– xuhdev
16年7月15日在5:04

@xuhdev它仍然存在于OpenSSH_7.2p2上,args不在第一个帮助消息(〜?)中,但在第二个帮助消息中(一旦有人用〜C进入ssh>提示符,则可以在ssh>提示符下键入help)

– sdaau
17年9月20日在8:59

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

– Sridhar Sarnobat
18年4月2日,0:49

#4 楼

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

mkdir -p /mnt/sshfs

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


然后可以使用鹦鹉螺,gnome,konqueror,海豚,bash或其他任何东西。

评论


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

–sshow
2015年9月20日在12:23

#5 楼


使用ssh-xfer(一种经过修改的ssh-agent),可以有效地使现有ssh副通道过载,以进行文件传输。
使用zssh,它实际上是ssh的zmodem。如果您曾经使用过rzsz,这看起来将非常熟悉。
反向(-R,用于远程到本地)或正向(-L,用于本地到远程)端口运行文件传输,前提是您已经另一端监听一些文件传输守护程序。

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

  # first connection
$ ssh remote

  # will multiplex over the same connection the original ssh opened
$ sftp remote


评论


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

– Stuart Woodward
2013年6月8日14:17在

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

– Ferran Basora
15年11月13日在11:09

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

– 0xAF
19年5月5日在20:13

#6 楼

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

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

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

评论


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

– Sridhar Sarnobat
19年5月29日下午5:48

该方法甚至可以扩展到剪贴板

–张勤生
20-04-22在20:00

#7 楼

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

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

评论


是的,或者按此处建议的sftp。

–原子
12年7月13日在11:08

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

– Freedom_Ben
13年7月24日在18:28

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

–basic6
17 Mar 27 '17 at 18:35

#8 楼

尽管使用实用的开源软件,但使用SecureCRT的众多原因之一是文件传输的便捷性。在F / OSS世界中,根本没有直接替代品。

SecureCRT最初是在1990年代中期作为纯Windows程序开始的,但几年前已移植到Mac OS X和Linux。 br />
SecureCRT具有三个主要功能,用于在SSH所连接的系统之间来回传输文件:和ASCII-SecureCRT是一种老式的终端仿真器,支持多种带内文件传输协议。

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

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

sz是“ send ZModem”程序,是lrzsz的一部分软件包。它已经为大多数Unixy系统打包了。如果由于某种原因您的远程系统尚未安装它,并且您不能轻松地安装二进制软件包,则源软件包很小并且具有很高的可移植性。我必须将lrzsz“ sharchive”或uuencode压缩包发送到精简的远程系统,以便可以将ZModem文件发送到它。)
集成的基本SFTP实现。

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

我将SFTP功能描述为“基本”功能,因为VanDyke软件具有单独的文件传输产品SecureFX。

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

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


拖放-如果将文件拖放到终端窗口,它将自动进行输入rz并开始发送文件。

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

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

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

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



#9 楼

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

#10 楼

如果您需要跳过一个(或多个)代理服务器,则OpenSSH v7.3及更高版本支持-J。考虑到hostA上的A→B→C,只需:
tar cf - file1 file_n | pv | ssh -C -J userB@hostB:portB userB@hostC -p portC 'tar xvf - -C hostC_destination_folder'


通过ssh的-J选项使用任意数量的跃点。
忽略tar的远程-C 将文件保留在主文件夹中。
一次发送任何文件(文本或二进制)。
通过使用ssh的-C(或tar的-z)压缩流来提高速度。如果数据是纯文本(未压缩),则特别有用。

pv通过管道监视数据的进度。一个替代方法可能是progress

灵感来自Florian Fida和Dan Garthwaite的答案。
这里介绍如何与Midnight Commander一起使用。