在我日常工作中,Mac 和 Windows 设备分别位于两个不同的 NAT 网络下,它们之间无法直接通信。然而,偶尔需要同步剪切板内容,就有点头疼。
为了解决这个问题,我利用一台 Linux 服务器作为中转节点。通过 SSH,手动把 Mac 和 Windows 各自的剪切板内容上传至服务器,并从服务器获取对方的剪切板内容。
需要特别说明的是,这个脚本仅支持同步简单的文字内容,无法处理图片或文件。如果需要同步这些类型的内容,需要考虑其他方案,例如局域网IM之类的(Synapse/Mattermost/Rocket.Chat/XMPP/Jabber/IRC),或者是文件共享目录,当然部署起来也稍微重一些。
Mac
#!/bin/bash
# 临时文件路径
TEMP_FILE="/tmp/clipboard_sync.txt"
# 从 Linux 服务器下载剪切板内容到本地临时文件
sshpass -p 'Abcd1234' ssh user@1.2.3.4 "cat /tmp/remote_clipboard.txt" > "$TEMP_FILE"
# 将本地剪切板内容上传到 Linux 服务器
pbpaste | sshpass -p 'Abcd1234' ssh user@1.2.3.4 "cat > /tmp/remote_clipboard.txt"
# 将临时文件内容拷贝到本地剪切板
cat "$TEMP_FILE" | pbcopy
Windows
@echo off
chcp 65001 >nul
:: 临时文件路径
set TEMP_FILE=%TEMP%\clipboard_sync.txt
:: 从 Linux 服务器下载剪切板内容到本地临时文件
plink -ssh -pw Abcd1234 -batch user@1.2.3.4 "cat /tmp/remote_clipboard.txt" > "%TEMP_FILE%"
:: if exist "%TEMP_FILE%" (
:: echo Clipboard content downloaded successfully to %TEMP_FILE%.
:: ) else (
:: echo Failed to download clipboard content.
:: )
:: 将本地剪切板内容上传到 Linux 服务器
powershell -command "Get-Clipboard" | plink -ssh -pw Abcd1234 -batch user@1.2.3.4 "cat > /tmp/remote_clipboard.txt"
:: 将临时文件内容拷贝到本地剪切板
powershell -command "Get-Content -Raw '%TEMP_FILE%' | Set-Clipboard"
:: echo Script execution completed.
:: pause
- plink 是 PuTTY 提供的命令行工具,可以用于 SSH 连接,并支持通过命令行参数传递密码。
- 注释的一些内容可以打开作为 debug 排查问题。
- 注意 windows 下的编码问题,可以把脚本全部拷贝到剪切板,然后windows下新建文件,保存成 utf-8 编码方式。