剪切板同步

Posted by Codeboy on April 17, 2019

工作中有两台主机,系统上一台macOS,一台Ubuntu,macOS作为主力机,经常需要将复制文本同步,之前的方案是登陆两个不同的微信进行分享,不过每次都需要打开,比较麻烦。

有没有什么办法能够解决 macOS 到 Ubuntu 的单向文本复制呢?单向解决了,双向基本也没有问题,鉴于作者没有双向需求,故本文只介绍 macOS 到 Ubuntu 的单项文本同步方案。目前可行的方案有:

方案 优缺点
IM、飞鸽传书 支持双向、操作流程略长
剪切板同步软件 支持双向,多平台支持不够,很多没有Linux
SSH 支持双向,多平台支持,配置稍微复杂,使用方便

本次采用外能的 ssh 进行剪切板同步,考虑到不希望把 macOS 上的剪切板全部同步,只需要同步需要的即可,结合 macOS 上另外一个神器 alfred 进行。

一、同步方案

macOS上操作剪切板非常的简单,pbcopypbpaste 分别对应复制和剪切,操作示例如下:

➜  ~ echo "Hello Codeboy" | pbcopy 
➜  ~ pbpaste
Hello Codeboy

Linux上需要安装 xclip 来完成,操作示例如下:

➜  ~ echo "Hello Codeboy" |  xclip -in -selection clipboard
➜  ~ xclip -o                                              
Hello Codeboy

由于 xclip 牵扯图形操作,不能直接使用ssh在远程主机上执行命令完成,我们使用文件进行内容传输即可,接收方定时检查文件是否有更新,有更新的话使用 xclip 同步到剪切板。 同时Ubuntu上需要配置 macOS 中 ssh 公钥,可以免密登陆,具体操作可以查询。

二、发送方(macOS)

我们使用 alfred中的workflow自定义快捷键执行脚本,操作如下:

  • 新建空白workflow
  • 添加Triggers –> HotKey,定义喜欢的按键,作者选择(alt+F),和复制键距离比较近。
  • 新建Action –> Run Script,输入复制脚本即可。
# 将剪切板内容写入文件
pbpaste > /tmp/clip_content
# 发送到目标主机
scp -q /tmp/clip_content user@host:/tmp/

这样需要复制的时候,ctrl-C 后再次按下 alt-F 即可发送。

三、接收方(Ubuntu)

接收方监听 /tmp/clip_content 文件内容变化即可,脚本如下:

#!/bin/bash
last_content=""
while true
do
 content=`cat /tmp/clip_content`
 if [ "$content" != "$last_content" ]
    then
      echo $content;
      xclip -in -selection clipboard < /tmp/clip_content
      last_content="$content"
 fi
 sleep 1
done

每秒钟检测该文件内容是否改变,改变的话复制到剪切板中,实时性还是很高的。打开终端,执行起来即可。

四、使用

macOS上遇到需要复制的文本,ctrl-C --> alt-F 后,切换到Ubuntu,直接粘贴即可。有更快捷的方式欢迎留言。

如有任何知识产权、版权问题或理论错误,还请指正。

转载请注明原作者及以上信息。