#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转发,则将文件复制到远程计算机上并将其粘贴到本地。您可以通过管道将数据传入和传出
xclip
或xsel
。如果要保留文件名和元数据,请复制粘贴存档。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客户端支持多路复用。假设您已经设置了
ControlMaster
和ControlPath
(ControlPersist
也很有用),# 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-copyfile
和xclip-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一起使用。
评论
如果客户端上有ssh服务器,则可以随时尝试使用scp file.foo user@myclient.com:file.foo:P当然可以,但是我不想允许我所工作的公司拥有的服务器访问我的计算机:)无论如何,我这里仅基于密钥的身份验证,并且放置私钥也不是太安全。在服务器上!
我不明白你的问题。生成一个新的密钥对,将公共部分复制到您的计算机authorized_keys中,然后在传输后再次删除该行。
我做了很多事情,所以每次我想在SSH会话中间复制文件时,这样做的效率都会很低。我只是在寻找一种方法,在SSH终端会话中,可以挂接到我的本地计算机,并使其无需离开当前SSH会话即可将文件发送到远程服务器。
问题在于,最初的ssh登录可能会很痛苦(2fa或键或密码之外的其他挑战),我们可能没有priv来更改ssh服务器的配置,没有理由必须多次进行键协商,并且一旦我们有了一个会话,最好将该会话用于多方面。