如果我通过 SSH 登录到系统,有没有办法将文件复制回我的本地系统,而无需启动另一个终端或屏幕会话并执行 scp 或类似操作,或者无需从远程系统执行 SSH 返回到本地系统?
Gil*_*il' 160
如果您提前计划,这是最容易的。
第一次打开主连接。对于后续连接,通过现有的主连接路由从连接。在您的 中~/.ssh/config,将连接共享设置为自动发生:
ControlMaster auto
ControlPath ~/.ssh/control:%h:%p:%r
Run Code Online (Sandbox Code Playgroud)
如果您将 ssh 会话启动到与现有连接相同的(用户、端口、机器),则第二个会话将通过第一个会话进行隧道传输。建立第二个连接不需要新的身份验证并且非常快。
因此,当您拥有活动连接时,您可以快速:
scp或复制文件rsync;在现有连接上,您可以建立反向 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 转发,请复制远程计算机上的文件并将其粘贴到本地。您可以通过管道将数据传入和传出xclip或xsel。如果要保留文件名和元数据,请复制粘贴存档。
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)
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.
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)。
如果您ControlMaster在ssh_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 或其他工具复制粘贴该文件。
eph*_*ent 15
-R,用于远程到本地)或转发(-L,用于本地到远程)端口来运行文件传输,假设您有一些文件传输守护程序在另一端侦听。但这些都不是真正需要的,IMO。SSH 协议支持单个连接上的多个通道,OpenSSH 客户端支持多路复用。假设你有ControlMaster和ControlPath 设置(ControlPersist同样是有用的)
# 第一次连接 $ ssh 远程 # 将在原始 ssh 打开的同一连接上进行多路复用 $ sftp 远程
小智 11
我发现最好和最有效的解决方案是使用xclip-copyfile和xclip-pastefile。
在服务器上,您xclip-copyfile用来复制一个或多个文件。然后这些文件在您的本地服务器上可用。在那里,您可以使用xclip-pastefile.
这绕过了使用scp或拥有本地 ssh 服务器的需要。例如,我将它与 cygwin 一起使用。唯一的问题是,xclip如果您还没有安装,则需要安装。哦,这也适用于二进制文件。
小智 10
一种更简单的方法:打开 Filezilla(或您最喜欢的 ftp 浏览器),打开到同一站点的 ssh 连接,找到该文件并将其拖到您的本地文件结构中。如果您是 Filezilla 的新手,请使用“站点管理器”功能下次快速重新连接。
是的,我知道这对你们中的大多数人来说是显而易见的(并且不完全是这样),但是一些(像我一样)发现这个线程搜索仅终端解决方案的人可能忽略了显而易见的问题。
| 归档时间: |
|
| 查看次数: |
360309 次 |
| 最近记录: |