通过SSH实现拷贝粘贴共享解决方案

摘要:当我们在需要在多台主机上工作或者各种虚拟机环境下工作时,如果不支持直接 Ctrl+C 和 Ctrl+V 的跨主机共享操作,那么连传递简单的字符串信息都变得十分麻烦。这里提出一个通用的解决方案来实现快速任意主机之间剪切板的共享。该方案使用 SSH ,所以理论上任意的支持 SSH 和允许使用命令行指令获取剪切板内容的主机都可以应用该方案。

概述

整个方案的思路十分简单,我们首先对方案描述中的主体进行定义

1:复制操作主机,成为分享者 Producer
2:粘贴操作主机,成为消费者 Consumer

方案:在分享者的主机上执行完 Ctrl+C 后,执行另外一条命令(可以自动也可以通过另外一个快捷键比如 Alt+C),这条命令首先获取复制到剪切板的内容,然后通过管道重定向(或者类似技术)定向到 消费者,重定向的过程使用 SSH 远程连接到消费者主机上,然后通过命令行执行拷贝动作,将重定向的内容拷贝到剪切板中。这样在消费者主机上就可以使用 Ctrl+V (或者 Command+V)进行粘贴操作了。

整个方案的重点

  1. 生产者主机命令行获取剪切板内容
  2. 生产者主机 SSH 客户端,如果服务器不支持证书,需支持命令带密码连接
  3. 消费者主机 SSH 服务器,最好配置可使用证书登陆,从而避免生产者解决自动密码问题
  4. 消费者主机命令行将内容复制到剪切板

下面我们一一解决上述问题,目前该文的解决方案只包含类似 Unix 系统,及 LinuxMac,暂时不包括 Windows。对于 Windows 只需要找到相对应功能的命令即可。

我们具体的命令行都是使用一下场景

  1. 生产者: Linux (Fedora)
  2. 消费者: Mac

命令行拷贝及粘贴

我们首先介绍一下通过命令行实现拷贝和黏贴操作。

Mac

在 Mac 上比较简单,因为 Apple 已经内置了命令来做这件事情,即 pbcopypbpaste 使用起来十分简单。

Linux

相对来说较为复杂,因为我们需要让命令行和窗口互通,而窗口本身在 Linux 中有多种。当然 Linux 环境下工具很多,总有一款适合你。

这里我仅介绍 X11,并推荐使用 xclip,只是一款开源的命令行工具

xclip is a command line utility that is designed to run on any system with an
X11 implementation. It provides an interface to X selections (“the clipboard”)
from the command line. It can read data from standard in or a file and place it
in an X selection for pasting into other X applications. xclip can also print
an X selection to standard out, which can then be redirected to a file or
another program.

有个这个工具就可以轻松在命令行中与剪切板进行互动啦。

  1. 获取剪切板内容: xclip -selection clipboard, 其中 clipboard 就是指的 X11 的剪切板。
  2. 粘贴操作: xclip -selection clipboard -o,其中 -o 就是 output 输出的意思

当然 xclip 还用很多用途,这里只需要上面两个用法就可以了。

另外如果希望获取和 Mac 一样的体验,可以自己在个人环境或者系统环境增加 alias 来达到和 Mac 一样的效果,增加如下内容到 ~/.bashrc,然后 source 一下:

1
2
3
4
# copy to clipboard
alias pbcopy='xclip -selection clipboard'
# paste from clipboard, if want to pass to function as parameter, use $(pbpaste)
alias pbpaste='xclip -selection clipboard -o'

复制操作主机配置

命令行

在生产者主机上的命令比较简单就是通过管道将剪切板内容送到 SSH 远程主机上,然后执行一个拷贝操作即可。

比如我们从 LinuxMac 拷贝

1
xclip -selection clipboard -o | ssh YOUR_USERNAME@YOUR_HOST_IP "pbcopy"

SSH 命令和密码同时输入 (不推荐,密码明文)

如果目标消费者主机不支持 SSH 证书登陆,那么上述命令还需要输入密码,这样没办法通过快捷建触发,我们可以使用其他工具来解决,该工具就是 sshpass,允许在命令行上指定SSH命令的密码。该方法会将密码明文显示在命令中,如果消费者主机非常重要,不推荐使用,但是如果只是一个本地的开发机,那么该方法还是很方便的。

这样上面的命令就要改成以下命令

1
xclip -selection clipboard -o | sshpass -p "YOUR_PASSWORD" ssh YOUR_USERNAME@YOUR_HOST_IP "pbcopy"

快捷键激活命令行

最后我们就要绑定快捷键到上述命令,这一步可能各个系统不一致,这里仅使用 Fedora 来介绍,其他系统应该都有类似功能。

FedoraSetting 中的 Keyboard 能够自定义快捷键,我们可以指定一个未被占用的快捷键组合,比如 Alt+C 来执行上述命令。

fedora keymap

目前没有在 Fedora 下找到如何通过 Ctrl+C 自动触发该动作,需要找到系统 Ctrl+C 快捷键注册的地方,才能进行自定义。

粘贴操作主机配置

SSH 服务器

作为消费者只需要配置成可使用 SSH 远程登录即可,无论在 Mac 还是 Linux 都可以轻松实现。这里不再赘述,可以自行搜索相应的开启方法,基本都是在配置选项中的一个开关。

SSH 证书验证

使用证书验证,这个配置就相对麻烦一点

Mac 系统可参考如下回答:如何配置 Mac 的 SSH 以及 如何实现 Mac 的 SSH 无密码登陆

使用场景

最主要的使用场景就是使用 MacOS 的虚拟机:

  1. 目前 VirtualBox 没有相应的工具来共享剪切板,使用该方法可以快速在两者之间共享复制的内容。
  2. 目前 VMware 已经有剪切板共享工具集成到 VMware Tool 中,但是通过使用发现,经过一段时间就会失效。

未来计划

增加文件复制支持