使用 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 中使用,特别是在复杂的目录结构中。


解决 Python Selenium 读取含颜文字文件时的 ChromeDriver 错误

今天在使用 Python Selenium 自动化浏览器操作的过程中,遇到了一个处理包含颜文字或其他非标准字符的错误。

问题描述

我正在编写一段 Python Selenium 代码来自动化填充网页上的文本框。我们需要从一个文件中读取文本,并将其输入到页面的 textarea 中。然而,当文件中包含颜文字或其他非 Basic Multilingual Plane (BMP) 字符时,程序可能会抛出如下错误:

Message: unknown error: ChromeDriver only supports characters in the BMP
(Session info: chrome=122.0.6261.94)

这个错误是由于 ChromeDriver 目前只支持 BMP 范围内的字符。BMP 是 Unicode 的一个子集,包含了从 U+0000U+FFFF 的字符,而一些特殊字符(如颜文字、部分表情符号等)超出了这个范围,位于 Supplementary Multilingual Plane (SMP) 或其他Plane中。

错误代码示例

首先,我们来看一下可能导致错误的代码示例:

import os
from selenium import webdriver

# 初始化 WebDriver
driver = webdriver.Chrome()

# 假设我们要输入文本到一个textarea中
last_textarea = driver.find_element(By.ID, "textarea_id")

# 读取文件内容
text_to_enter = ""
file_path = "path/to/your/file.txt"
if os.path.exists(file_path):
    print(f"打开文件 {file_path}")
    with open(file_path, 'r', encoding='utf-8') as file:
        text_to_enter = file.read()
else:
    print(f"文件 {file_path} 不存在")

# 将内容输入到textarea中
last_textarea.send_keys(text_to_enter)
print("输入: " + text_to_enter)

当文件中包含超出 BMP 范围的字符时,send_keys 方法会抛出上述错误。

解决方案

1. 过滤掉非 BMP 字符

最简单的方法是过滤掉所有不在 BMP 范围内的字符。这可以通过 Python 的字符编码范围来实现:

def filter_non_bmp(text):
    return ''.join(c for c in text if c <= '\uFFFF')

# 读取文件内容并过滤非BMP字符
text_to_enter = ""
file_path = "path/to/your/file.txt"
if os.path.exists(file_path):
    print(f"打开文件 {file_path}")
    with open(file_path, 'r', encoding='utf-8') as file:
        text_to_enter = file.read()
    text_to_enter = filter_non_bmp(text_to_enter)
else:
    print(f"文件 {file_path} 不存在")

# 将过滤后的内容输入到textarea中
last_textarea.send_keys(text_to_enter)
print("输入: " + text_to_enter)

这段代码会移除所有不在 BMP 范围内的字符,从而避免 ChromeDriver 抛出错误。

2. 替换非 BMP 字符

如果我们希望保留文本的完整性,而不是直接删除字符,可以考虑将非 BMP 字符替换为一些替代字符或转义符:

def replace_non_bmp(text, replacement='�'):
    return ''.join(c if c <= '\uFFFF' else replacement for c in text)

# 读取文件内容并替换非BMP字符
text_to_enter = ""
file_path = "path/to/your/file.txt"
if os.path.exists(file_path):
    print(f"打开文件 {file_path}")
    with open(file_path, 'r', encoding='utf-8') as file:
        text_to_enter = file.read()
    text_to_enter = replace_non_bmp(text_to_enter)
else:
    print(f"文件 {file_path} 不存在")

# 将替换后的内容输入到textarea中
last_textarea.send_keys(text_to_enter)
print("输入: " + text_to_enter)

在这个示例中,我将所有非 BMP 字符替换为一个占位符