Lan Mouse
Lan Mouse 是一款类似于 Apple 设备上 Universal Control 的鼠标和键盘共享软件。
它允许使用一套鼠标和键盘操控多台电脑。
这也被称为软件 KVM 切换器。
主要目标是 Linux 上的 Wayland,但 Windows、MacOS 和使用 Xorg 的 Linux 也有部分支持(详见下文)。
- 现在有了 gtk 前端
该项目的目标是成为专有工具如 Synergy 2/3、Share Mouse 的开源替代品。
重点在于性能和干净、可管理的实现,便于扩展支持其他后端,如 Android、iOS 等。
因为使用 Rust 编写,所以超快速™。
另一个替代方案(目标略有不同)是 Input Leap。
[!警告] 由于这个工具在过去几天获得了一些关注:
目前所有网络流量都是未加密的,以明文方式发送。
恶意行为者如果可以访问网络,可能会读取输入数据或通过伪造 IP 发送输入事件来控制设备。
因此,目前您应该只在本地网络中使用受信任的设备使用此工具, 我不对任何数据泄露负责!
操作系统支持
下表显示了不同操作系统上对输入模拟(模拟从其他客户端接收的事件)和 输入捕获(向其他客户端发送事件)的支持:
操作系统 / 桌面环境 | 输入模拟 | 输入捕获 |
---|---|---|
Wayland (wlroots) | :heavy_check_mark: | :heavy_check_mark: |
Wayland (KDE) | :heavy_check_mark: | :heavy_check_mark: |
Wayland (Gnome) | :heavy_check_mark: | :heavy_check_mark: (从 GNOME 45 开始) |
Windows | :heavy_check_mark: | :heavy_check_mark: |
X11 | :heavy_check_mark: | 进行中 |
MacOS | :heavy_check_mark: | 进行中 |
[!重要] Gnome -> Sway 只能部分工作(修饰键事件处理不正确)
[!重要] Wayfire
如果您使用 Wayfire,请确保使用较新版本(必须比 10 月 23 日更新),并且在 Wayfire 配置中的插件列表中添加
shortcuts-inhibit
! 否则输入捕获将无法工作。
[!重要] 如果 Windows 系统没有连接真实鼠标, 向其发送输入时鼠标光标将不可见。
安装
通过 cargo 安装
cargo install lan-mouse
从 Releases 下载
Windows、MacOS 和 Linux 的预编译发布二进制文件可在发布区获取。
对于 Windows,依赖项包含在 .zip 文件中,对于其他操作系统,请参见安装依赖项。
Arch Linux
可以从官方仓库安装 Lan Mouse:
pacman -S lan-mouse
也可以在 AUR 上获取:
# git 版本(包含最新更改)
paru -S lan-mouse-git
# 或者
paru -S lan-mouse-bin
Nix
- nixpkgs: search.nixos.org
- flake: README.md
手动安装
首先确保安装必要的依赖项。
以发布模式构建:
cargo build --release
直接运行:
cargo run --release
安装文件:
# 安装 lan-mouse
sudo cp target/release/lan-mouse /usr/local/bin/
# 安装应用图标
sudo mkdir -p /usr/local/share/icons/hicolor/scalable/apps
sudo cp resources/de.feschber.LanMouse.svg /usr/local/share/icons/hicolor/scalable/apps
# 更新图标缓存
gtk-update-icon-cache /usr/local/share/icons/hicolor/
# 安装桌面入口
sudo mkdir -p /usr/local/share/applications
sudo cp de.feschber.LanMouse.desktop /usr/local/share/applications
# 使用 firewalld 时:安装防火墙规则
sudo cp firewall/lan-mouse.xml /etc/firewalld/services
# -> 在 firewalld 设置中启用服务
条件编译
目前只支持 x11、wayland、windows 和 MacOS 后端。
根据使用的工具链,自动省略对其他平台的支持
(在 Windows 的 .exe
中包含 x11 和 wayland 后端支持是没有意义的)。
然而,在 Linux 系统上可能仍然想要省略对 wayland、x11 或 libei 的支持。
这可以通过 cargo features 实现。
例如,如果只需要 wayland 支持,以下命令将生成 一个只支持 wayland 的可执行文件:
cargo build --no-default-features --features wayland
有关可用功能的详细列表,请查看 Cargo.toml
安装依赖项
MacOS
brew install libadwaita
Ubuntu 及其衍生版
sudo apt install libadwaita-1-dev libgtk-4-dev libx11-dev libxtst-dev
Arch 及其衍生版
sudo pacman -S libadwaita gtk libx11 libxtst
Fedora 及其衍生版
sudo dnf install libadwaita-devel libXtst-devel libX11-devel
Windows
[!注意] 这只在从源代码构建 lan-mouse 时需要。Windows 发布版附带预编译的 gtk dll。
-
首先安装 Rust。
-
然后按照 gtk-rs.org 的说明进行操作
简要说明:
从源代码构建 gtk
- 以下命令应在管理员权限的 PowerShell 实例中运行:
# 安装 chocolatey
Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
# 安装 gvsbuild 依赖项
choco install python git msys2 visualstudio2022-workload-vctools
- 以下命令应在普通 PowerShell 实例中运行:
# 使用 python 安装 gvsbuild
python -m pip install --user pipx
python -m pipx ensurepath
- 重新启动 PowerShell 实例,以使环境变化生效。
pipx install gvsbuild
# 构建 gtk + libadwaita
gvsbuild build gtk4 libadwaita librsvg
- 确保将目录
C:\gtk-build\gtk\x64\release\bin
添加到PATH
环境变量中。否则项目将无法构建。
为避免从源代码构建 GTK,可以禁用 gtk 前端(参见下面的条件编译)。
使用方法
Gtk 前端
默认情况下,运行 lan-mouse
时会打开 gtk 前端。
要添加新连接,只需在两个设备上点击 添加
按钮,
输入相应的主机名并激活它。
如果鼠标无法移动到设备上,请确保在防火墙中开放了端口 4242
(或所选端口)。
命令行界面
可以使用 --frontend cli
作为命令行参数启用 cli 界面。
输入 help
列出可用命令。
例如:
$ cargo run --release -- --frontend cli
(...)
> connect <host> left|right|top|bottom
(...)
> list
(...)
> activate 0
守护进程
Lan Mouse 可以以守护进程模式启动,以在后台保持运行。
要这样做,请在命令行参数中添加 --daemon
:
$ cargo run --release -- --daemon
为了在图形会话中自动启动 lan-mouse, 可以使用 systemd-service:
将文件复制到 ~/.config/systemd/user/
并启用服务:
cp service/lan-mouse.service ~/.config/systemd/user
systemctl --user daemon-reload
systemctl --user enable --now lan-mouse.service
配置
为了在启动时自动加载客户端,会解析 $XDG_CONFIG_HOME/lan-mouse/config.toml
文件。
$XDG_CONFIG_HOME
默认为 ~/.config/
。
要创建此文件,您可以复制以下示例配置:
示例配置
[!提示] 释放绑定中的键符号按照 src/scancode.rs#L172 中的名称命名。 这可能会改变
# 示例配置
# 配置释放绑定
release_bind = [ "KeyA", "KeyS", "KeyD", "KeyF" ]
# 可选端口(默认为 4242)
port = 4242
# # 可选前端 -> 如果可用,默认为 gtk
# # 可能的值为 "cli" 和 "gtk"
# frontend = "gtk"
# 在右侧定义一个主机名为 "iridium" 的客户端
[right]
# 主机名
hostname = "iridium"
# lan-mouse 启动时立即激活此客户端
activate_on_startup = true
# 可选的(已知)IP 地址列表
ips = ["192.168.178.156"]
# 在左侧定义一个 IP 地址为 192.168.178.189 的客户端
[left]
# 主机名是可选的:如果未指定主机名,
# 至少需要指定一个 IP 地址。
hostname = "thorium"
# 以太网和 WiFi 的 IP
ips = ["192.168.178.189", "192.168.178.172"]
# 可选端口
port = 4242
其中 left
可以是 left
、right
、top
或 bottom
。
路线图
- 图形前端(gtk + libadwaita)
- 遵循 xdg-config-home 的配置文件位置。
- IP 地址切换
- 活跃度跟踪 客户端无法访问时自动释放鼠标
- 活跃度跟踪:服务器离线时自动释放按键
- MacOS 键码转换
- Libei 输入捕获
- X11 输入捕获
- Windows 输入捕获
- MacOS 输入捕获
- 延迟测量和可视化
- 带宽使用测量和可视化
- 剪贴板支持
- 加密
协议
目前出于性能考虑,所有鼠标和键盘事件都通过 UDP 发送。 每个事件作为一个单独的数据包发送,目前没有任何确认机制来保证 0% 的数据包丢失。 这意味着,任何丢失的数据包都会导致鼠标/键盘事件被丢弃,目前这种情况被忽略。
UDP 还有一个额外的好处,就是不需要重连逻辑。 任何客户端都可以直接离线,一旦重新上线就会立即开始工作。
此外,还托管了一个 TCP 服务器,用于需