使用 Linux 服务器同步 Mac 和 Windows 剪切板 2

接着上一篇文章,在Mac上随手把同步图片和文件的功能也做了,Windows暂时不用,就不做了。简单说明一下内容:

核心逻辑: osascript -e 'clipboard info' 2>/dev/null:

  1. 文件内容处理

    osascript -e 'clipboard info'
    «class furl», 39, «class ut16», 22, «class utf8», 10, «class icns», 781190, Unicode text, 20, string, 10, «class 8BPS», 1068148, GIF picture, 48307, «class jp2 », 66756, JPEG picture, 53765, TIFF picture, 4198020, «class PNGf», 202292, «class BMP », 4194442, «class TPIC», 735063
    
  2. 图片内容检测

    osascript -e 'clipboard info'
    *** Error creating a JP2 color space: falling back to sRGB
    «class PNGf», 30911, «class 8BPS», 120626, GIF picture, 9586, «class jp2 », 30845, JPEG picture, 20160, TIFF picture, 1053698, «class BMP », 1052906, «class TPIC», 46827
    
  3. 文本内容检测

    osascript -e 'clipboard info'
    «class utf8», 96, «class ut16», 186, string, 9, Unicode text, 184
    

还有一个注意点是,文件处理的 «class furl»,路径分隔是:`,所以做了一些其他处理:

osascript -e 'the clipboard as «class furl»'
file Macintosh HD:Users:kelu:Downloads:xxx.sh

以下是具体代码:

# ver 2.0
# 远端路径定义
REMOTE_DIR="/tmp/clipboard"
REMOTE_HOST="1.2.3.4"
REMOTE_USER="user"
REMOTE_PASS="password"

LOCAL_DIR="$HOME/Downloads"
TEXT_FILE="clipboard_sync.txt"
IMAGE_FILE="clipboard_content.png"

# 检查远端是否有 /tmp/clipboard 文件夹
REMOTE_EXISTS=$(sshpass -p "$REMOTE_PASS" ssh $REMOTE_USER@$REMOTE_HOST "[ -d $REMOTE_DIR ] && echo 'exists'")

if [ "$REMOTE_EXISTS" == "exists" ]; then
    echo "# 远端文件夹存在" 
    if sshpass -p "$REMOTE_PASS" ssh $REMOTE_USER@$REMOTE_HOST "[ -f $REMOTE_DIR/$TEXT_FILE ]"; then
        echo "# 拷贝文字到剪切板" 
        sshpass -p "$REMOTE_PASS" scp $REMOTE_USER@$REMOTE_HOST:"$REMOTE_DIR/$TEXT_FILE" "$LOCAL_DIR/$TEXT_FILE"
        cat "$LOCAL_DIR/$TEXT_FILE" | pbcopy
        cat "$LOCAL_DIR/$TEXT_FILE" | head -n 1
        echo ""
    elif sshpass -p "$REMOTE_PASS" ssh $REMOTE_USER@$REMOTE_HOST "[ -f $REMOTE_DIR/$IMAGE_FILE ]"; then
        echo "# 下载图片到本地剪切板" 
        sshpass -p "$REMOTE_PASS" scp $REMOTE_USER@$REMOTE_HOST:"$REMOTE_DIR/$IMAGE_FILE" "$LOCAL_DIR/$IMAGE_FILE"
        osascript -e "set the clipboard to (read (POSIX file \"$LOCAL_DIR/$IMAGE_FILE\") as «class PNGf»)"
    else
        echo "# 获取远端目录中的文件"
        RANDOM_FILE=$(sshpass -p "$REMOTE_PASS" ssh $REMOTE_USER@$REMOTE_HOST "ls -1 $REMOTE_DIR | shuf -n 1")

        if [ -n "$RANDOM_FILE" ]; then
            echo "# 下载文件 $RANDOM_FILE"
            sshpass -p "$REMOTE_PASS" scp $REMOTE_USER@$REMOTE_HOST:"$REMOTE_DIR/$RANDOM_FILE" "$LOCAL_DIR/$RANDOM_FILE"

            filePath="$LOCAL_DIR/$RANDOM_FILE"
osascript <<EOF
set filePath to POSIX file "$filePath" as alias
tell application "Finder"
    set the clipboard to (filePath as «class furl»)
end tell
EOF
        fi
    fi

    echo "# 清除远端数据"
    sshpass -p "$REMOTE_PASS" ssh $REMOTE_USER@$REMOTE_HOST "rm -rf $REMOTE_DIR"
else
    sshpass -p "$REMOTE_PASS" ssh $REMOTE_USER@$REMOTE_HOST "mkdir -p $REMOTE_DIR"

    CLIPBOARD_TYPE=$(osascript -e 'clipboard info' 2>/dev/null)


    if echo "$CLIPBOARD_TYPE" | grep -q "furl"; then
        # 获取剪贴板中的路径
        FILE_PATH=$(osascript -e 'the clipboard as «class furl»' | tr -d '"')

        # 将 Mac 路径转换为 POSIX 路径
        FILE_PATH_POSIX=$(osascript -e "POSIX path of POSIX file \"$FILE_PATH\"")

        # 将 POSIX 路径中的冒号替换为斜杠
        FILE_PATH_POSIX=$(echo "$FILE_PATH_POSIX" | sed 's/:/\//g' | sed -e 's/^file Macintosh HD//')

        echo "# 检测到文件路径: $FILE_PATH_POSIX"
        sshpass -p "$REMOTE_PASS" scp "$FILE_PATH_POSIX" $REMOTE_USER@$REMOTE_HOST:"$REMOTE_DIR/"
        echo "# 推送远端剪切板文件"
        exit 0
    fi

    if echo "$CLIPBOARD_TYPE" | grep -q "TIFF"; then
        echo "# 将剪切板中的图片保存为文件"
        osascript -e 'set imgData to the clipboard as «class PNGf»
                      set imgFile to open for access POSIX file "'$LOCAL_DIR/$IMAGE_FILE'" with write permission
                      write imgData to imgFile
                      close access imgFile' 2>/dev/null
        sshpass -p "$REMOTE_PASS" scp "$LOCAL_DIR/$IMAGE_FILE" $REMOTE_USER@$REMOTE_HOST:"$REMOTE_DIR/"
        echo "# 推送远端剪切板图片"
        rm "$LOCAL_DIR/$IMAGE_FILE"
        exit 0
    fi

    if echo "$CLIPBOARD_TYPE" | grep -q "string\|Unicode text"; then
        echo "# 检测到文本内容"
        pbpaste > "$LOCAL_DIR/$TEXT_FILE"
        sshpass -p "$REMOTE_PASS" scp "$LOCAL_DIR/$TEXT_FILE" $REMOTE_USER@$REMOTE_HOST:"$REMOTE_DIR/$TEXT_FILE"
        echo "# 推送远端剪切板文字"
        cat "$LOCAL_DIR/$TEXT_FILE" | head -n 1
        rm "$LOCAL_DIR/$TEXT_FILE"
        exit 0
    fi

    sshpass -p "$REMOTE_PASS" ssh $REMOTE_USER@$REMOTE_HOST "rm -rf $REMOTE_DIR"
fi


使用 Linux 服务器同步 Mac 和 Windows 剪切板

在我日常工作中,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 编码方式。

将 FileZilla 配置文件从 Windows 7 迁移到 Windows 10

FileZilla 的配置文件通常存放在用户目录下的一个隐藏文件夹中。具体路径如下:

  • Windows 7:
    C:\Users\<你的用户名>\AppData\Roaming\FileZilla\
    
  • Windows 10:

    C:\Users\<你的用户名>\AppData\Roaming\FileZilla\
    

在这个目录下,可以找到以下文件:

  • filezilla.xml:包含主要的配置设置。
  • sitemanager.xml:保存站点管理器中的站点信息。
  • bookmarks.xml:保存书签。
  • layout.xml:保存 FileZilla 界面的布局设置。
  • queue.sqlite3:包含传输队列的数据库文件。
  • recentservers.xml:记录最近连接的服务器信息。
  • trustedcerts.xml:保存受信任的证书信息。

复制粘贴到新机器上即可。


在 Windows 10 中重新启用 Windows 照片查看器

虽然 Windows 10 不再默认提供Windows 照片查看器,但它依然隐藏在系统中,只需要通过一些简单的操作就能重新启用。

步骤一:打开注册表编辑器

  1. 按下 Win + R 组合键,调出运行对话框。
  2. 在对话框中输入 regedit,然后按下 Enter 键或点击“确定”按钮。
  3. 如果系统弹出用户账户控制(UAC)提示,选择“是”以允许注册表编辑器进行更改。

步骤二:导航到指定路径

在注册表编辑器中,按照以下路径导航:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Photo Viewer\Capabilities\FileAssociations

这段路径指定了 Windows 照片查看器的文件关联设置,在这里手动添加对图片文件格式的支持。

步骤三:添加文件关联

  1. 在右侧的空白区域,右键点击,选择 “新建” -> “字符串值”
  2. 将新建的字符串值命名为文件扩展名。例如,若要为 JPG 文件添加关联,输入 .jpg
  3. 双击刚刚创建的字符串值,并将其数值数据设置为 PhotoViewer.FileAssoc.Tiff。这个数值告诉系统将该文件格式与 Windows 照片查看器关联。

  4. 重复上述步骤,为其他常见的图片格式(如 .jpeg.png.bmp.gif 等)创建字符串值,并同样设置其数据为 PhotoViewer.FileAssoc.Tiff

步骤四:设置默认应用

完成注册表的修改后,还需要将 Windows 照片查看器设置为图片文件的默认打开方式:

  1. 找到一个图片文件(如 .jpg 文件)。
  2. 右键点击该文件,并选择 “打开方式” -> “选择其他应用”
  3. 在弹出的列表中,向下滚动查找并选择“Windows 照片查看器”。
  4. 勾选“始终使用此应用打开 .jpg 文件”以将其设为默认应用。
  5. 点击“确定”。

如何在 macOS 安装 `.cer` 证书文件

  1. 下载证书:
    • 确保已经下载了 XXX-CA.cer 文件。
  2. 打开“钥匙串访问”应用:
    • 在 “聚焦搜索” 中搜索 钥匙串访问,或从“应用程序” -> “实用工具”中打开“钥匙串访问”。
  3. 导入证书:
    • 在“钥匙串访问”窗口中,点击左上角的“文件”菜单,然后选择“导入项目…”。找到并选择你下载的 XXX-CA.cer 文件。
  4. 选择钥匙串:
    • 系统会提示选择将证书存储到哪个钥匙串中。选择将其存储在“系统”钥匙串中。
  5. 调整证书信任设置:
    • 证书导入后,需要设置信任级别。找到刚刚导入的证书(通常会在“系统”钥匙串中显示),双击它以打开证书详细信息。
    • 展开“信任”部分,在“使用此证书时”下拉菜单中选择“始终信任”。
    • 关闭窗口,系统可能会要求输入管理员密码来确认更改。

如何在 macOS 下查询应用的服务器地址

本文将介绍如何在 macOS 下查询应用的服务器地址。

一、通过netstat命令查看网络连接

netstat 是一个非常有用的网络工具,它可以显示当前所有的网络连接状态。

运行netstat命令:

netstat -an | grep ESTABLISHED
  • 这条命令会显示当前所有已建立的网络连接。通过显示的 IP 地址和端口信息,你可以推测出特定应用连接的服务器地址。

二、通过lsof命令查看特定应用的网络连接

lsof(List Open Files)命令可以直接查看某个特定应用程序的网络连接。

sudo lsof -i -n -P | grep [应用程序名称]
  • [应用程序名称] 替换为你要查询的应用程序名称。这会列出该应用的所有网络连接,显示其连接的 IP 地址和端口。

在 macOS zsh 下删除 .tgz 文件外的所有文件和文件夹

在日常运维工作中,我们经常需要清理目录中的文件或文件夹,这次我只想保留 .tgz 文件,而删除其他所有的内容。

在 macOS 默认的 zsh 环境中,这个操作和 bash有一些不同的实现方式。

步骤

1. 启用 zsh 的扩展通配符功能

zsh 提供了一些强大的通配符功能,但需要先启用它们。可以通过以下命令启用扩展的通配符匹配:

setopt extended_glob

2. 使用 rm 命令删除文件和文件夹

rm -rf -- ^*.tgz

3. 命令详解

  • setopt extended_glob:启用 zsh 的扩展通配符,使我们可以使用更强大的匹配模式。
  • ^*.tgz^ 用于取反匹配,表示排除所有 .tgz 文件之外的其他文件和文件夹。
  • rm -rf:递归删除所有匹配的文件和文件夹。
  • --:标志命令选项的结束,避免路径被解释为选项。

4. 注意事项

  1. 操作慎重rm -rf 命令非常危险,执行时请务必确认路径和匹配模式正确无误,避免误删重要文件。

  2. 适用范围:上述方法适用于 zsh 环境。

备选方案

如果不想启用 zsh 的扩展通配符,或者希望在 bashzsh 环境下都能通用,可以使用 find 命令:

find /path/to/app -mindepth 1 ! -name "*.tgz" -exec rm -rf {} +

这种方式可以更加灵活地在各种 shell 中使用,特别是在复杂的目录结构中。


1 2 5 6 7 8 9 164 165