通过SSH将输入复制到剪贴板吗?


33

这是我的用例:

  • 我经常通过SSH连接到其他计算机以进行工作,并且我经常需要将文件/文本从服务器复制并粘贴到本地运行的编辑器中,以编写示例和共享文本。
  • 通常,如果文本足够小,我将只复制终端程序(当前为gnome-terminal)的输出并粘贴。
  • 但是,对于整个文档,我的选择非常有限。我可以逐块复制文档,也可以将其复制scp到本地计算机。

有没有办法使用这样的程序,例如xclip允许我将远程复制stdin到本地X服务器的剪贴板的程序?效果:

cat myconffile.conf | sed {...} | copy-over-ssh-to-local-clipboard

会很棒。是否存在使之成为可能的东西?

Answers:


20

如果您通过X转发运行ssh,这是透明的:远程命令(包括xclip)可以访问X服务器(包括其键盘)。确保您已经ForwardX11 yes在服务器中,~/.ssh/config并且已经在X11Forwarding yes服务器中sshd_config(根据您的发行版,这些选项默认情况下处于启用或禁用状态)。

<myconffile.conf sed {...} | xclip -i

还有其他处理远程文件的方法,它们可能更方便,例如,使用SSHfs在本地计算机上安装远程目录,或使用Tramp在Emacs中打开远程文件。如果您已设置ssh和FUSE并安装了SSHfs,则SSHfs就像一样简单mkdir ~/net/myserver; sshfs myserver:/ ~/net/myserver。如果您已设置ssh并安装了Emacs,那么Tramp就像打开一样容易/myserver:/path/to/file


1
默认情况下,在conf文件中是否存在以这种方式运行事物的安全漏洞?
Naftuli Kay 2011年

否。所有x11流量都通过SSH通道转发。
Shadur

2
@TKKocheran不是。在服务器端,没有。在客户端方面,它有一点点之处在于它为服务器管理员提供了进入客户端的方法,但是在99%的情况下,服务器管理员仍然有方法。请参阅如果有人在我的计算机上登录了SSH,可以访问他们的计算机吗?
吉尔(Gilles)“所以,别再邪恶了”,

7

您不需要任何特别的东西。由于xclip工作结束stdin

ssh remotehost xclip < myconf.conf

为什么需要对其进行修改sedssh在不用作终端时对数据透明,并且通常用于诸如

tar cfz - somedir | ssh remotehost 'cd destdir; tar xfz -'`

有没有办法在现有的SSH会话中执行此操作?如果我已经打开了所涉及的计算机的某个窗口,我真的不希望不必打开另一个终端窗口。
Naftuli Kay 2011年

sed仅作为示例,如果我想stdin在将其复制到剪贴板之前对其进行任何处理,则希望使用该选项。
Naftuli Kay 2011年

不,无法将数据注入到现有ssh会话中(如果可以的话,这将不是很安全)。您可以设置这些ssh ControlMaster东西以在现有连接上多路复用其他连接,但这对于初学者来说并不是真正的东西,之后仍然可以通过切换到另一个本地终端并运行上面的命令(不会打开新的连接)以相同的方式进行操作。终端窗口)。
geekosaur 2011年

@NaftuliKay有关在常规SSH会话中运行的解决方案,请参阅我的回答
tanius

5

这是在本地计算机上的OSX上执行操作的方法

ssh remotehost.com "<some/file.txt" | pbcopy

3

如果您的本地计算机正在运行Windows(7+),则可以从命令行使用此命令:

ssh user@server cat /home/user/file | clip

1

〜/ .ssh / config:

Host REMOTEHOST
    ...
    ForwardX11 yes

/ etc / ssh / sshd_config:

X11Forwarding yes

重击:

$ xclip -o | ssh REMOTEHOST 'DISPLAY=:0 xclip -i'

1

但是,它与@ d-raev和@ william-casarin的解决方案非常相似,因此有所不同,因此我将分享对我有用的解决方案。

命令

ssh user@host "cat <myconffile.conf" | xclip -sel clip

说明

ssh用于创建安全隧道,登录到user@ hostip,然后执行cat以打印的内容,然后将该内容<myconffile.conf通过stdout管道传输到xclip -sel clip本地计算机上的命令,该命令将其内容<myconffile.conf放入本地计算机的剪贴板中。

实际示例用法

我在Ubuntu 16.04和18.04上的Bash上使用此命令结构来执行诸如将ssh密钥粘贴到github(允许在运行命令后进行简单的ctrl-V或粘贴选择)之类的任务。退房man sshman cat以及man xclip为行为和选项的详细信息。


这甚至还可以复制无头的服务器,在那里xclip将无法运行,因为没有X.
tanius

0

我对LUbuntu的lxterminal(测试了各种终端)将剪贴板粘贴到ssh会话有类似的问题。如果剪贴板有大约100多个字节,则会话超时并失败。

如果我通过ssh连接到几乎所有CentOS 5.x服务器,然后再连接到目标服务器,则剪贴板粘贴对任何合理的数据大小都没有问题。


0

从平常的SSH会话内部从无头服务器复制到本地剪贴板:

  1. ncat在本地和远程计算机上安装。(在远程计算机上,您也可以使用nc或plain进行操作telnet,但是在本地计算机上,我们需要执行命令(-c/ -e)的选项,这些选项nc在Debian和Ubuntu等常规发行版中不可用。)

    apt install nmap
    
  2. 在本地计算机上,设置一个侦听本地接口的服务器,该服务器会将端口10009上传入的内容复制到X剪贴板:

    ncat --keep-open --listen --sh-exec "xclip -selection clipboard" localhost 10009
    

    或使用等效的速记版本:

    ncat -klc "xclip -sel c" localhost 10009
    
  3. SSH到远程计算机,以这种方式建立从远程计算机的端口10008到本地计算机(服务器正在侦听的端口)上的端口10009的反向隧道。您可以将该SSH会话用于正常工作。

    ssh -R 10008:localhost:10009 user@example.com
    
  4. 如果要将文件的内容从远程计算机复制到本地剪贴板,请在SSH shell中执行:

    ncat --send-only localhost 10008 < file.txt
    

    当然,当打包为shell快捷方式或脚本时,效果会更好。我们可以将其称为rclip“复制到远程剪贴板”,类似于众所周知的xclip

好处

  • 无需打开与远程计算机的另一个SSH会话。

  • 不需要xclip在远程计算机上,因此,如果您无法安装或无法使用它,它就可以工作,因为它是没有X的无头服务器。

安全

我们ncat -l localhost 10009为服务器做,这意味着它仅在具有localhostIP地址的网络接口上侦听。此本地循环接口仅允许来自您自己计算机的连接(在这种情况下,包括通过SSH反向隧道连接的连接)。因此,即使您不在防火墙后面,您的端口10009也不会暴露给Internet上的任何人。

资源

改编自dergachev / ssh-forward-clipboard.md要在Linux上运行。该要点还包含有关如何使SSH反向隧道成为默认设置的说明。


-1

https://secure.wikimedia.org/wikipedia/zh/wiki/Base64

您可以将Base64剪贴板数据转换为ASCII文本。然后,您可以将其通过现有的SSH连接进行推送。


为什么要转换成任何东西?在这种情况下,它已经是文本了,即使它是二进制的,也没有理由不能通过这样的管道发送它。
卡雷布(Caleb)

剪贴板中可能包含二进制数据,例如:已编译的应用程序
LanceBaynes 2011年

是的,可以,但是为什么会有问题呢?二进制数据可以通过管道和ssh隧道进行传输。
卡莱布
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.