5 个不稳定版本
0.9.1 | 2024年7月30日 |
---|---|
0.9.0 | 2024年7月30日 |
0.8.0 | 2024年5月17日 |
0.7.3 | 2024年3月22日 |
0.7.2 | 2024年3月21日 |
#249 in 网络编程
每月383次下载
365KB
9K SLoC
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。
[!WARNING] 由于这个工具在过去几天获得了一些人气
所有网络流量目前都是 未加密的,并以 明文 发送。
如果网络中有恶意行为者,他们可以读取输入数据或发送带有伪造 IP 的输入事件以控制设备。
因此,您现在应该只在您的本地网络中使用此工具,并且对于任何数据泄露不承担任何责任!
操作系统支持
以下表格显示了不同操作系统上对输入仿真(模拟从其他客户端接收的事件)和输入捕获(将事件 发送 到其他客户端)的支持
操作系统 / 桌面环境 | 输入仿真 | 输入捕获 |
---|---|---|
Wayland (wlroots) | ✔️ | ✔️ |
Wayland (KDE) | ✔️ | ✔️ |
Wayland (Gnome) | ✔️ | ✔️(从 GNOME 45 开始) |
Windows | ✔️ | ✔️ |
X11 | ✔️ | WIP |
MacOS | ✔️ | WIP |
[!Important] Gnome -> Sway 只部分工作(修饰符事件处理不正确)
[!重要] Wayfire
如果您正在使用 Wayfire,请确保使用最新版本(必须晚于10月23日),并在您的wayfire配置中将
shortcuts-inhibit
添加到插件列表!否则输入捕获将无法工作。
[!重要] 如果机器没有连接真实鼠标,将输入到Windows系统的鼠标光标将不可见。
安装
通过cargo安装
cargo install lan-mouse
从发行版下载
Windows、MacOS和Linux的预编译发行版二进制文件可在发行版部分找到。
对于Windows,依赖项包含在.zip文件中,对于其他操作系统,请参阅安装依赖项。
Arch Linux
可以从官方仓库安装Lan Mouse。
pacman -S lan-mouse
它也存在于AUR上
# git version (includes latest changes)
paru -S lan-mouse-git
# alternatively
paru -S lan-mouse-bin
Nix
- nixpkgs: search.nixos.org
- flake: README.md
手动安装
首先确保安装必要的依赖项。
以发布模式构建
cargo build --release
直接运行
cargo run --release
安装文件
# install lan-mouse
sudo cp target/release/lan-mouse /usr/local/bin/
# install app icon
sudo mkdir -p /usr/local/share/icons/hicolor/scalable/apps
sudo cp resources/de.feschber.LanMouse.svg /usr/local/share/icons/hicolor/scalable/apps
# update icon cache
gtk-update-icon-cache /usr/local/share/icons/hicolor/
# install desktop entry
sudo mkdir -p /usr/local/share/applications
sudo cp de.feschber.LanMouse.desktop /usr/local/share/applications
# when using firewalld: install firewall rule
sudo cp firewall/lan-mouse.xml /etc/firewalld/services
# -> enable the service in firewalld settings
条件编译
目前仅支持x11、wayland、windows和MacOS后端。根据使用的工具链,自动省略对其他平台的支持(没有意义在支持x11和wayland后端的情况下构建Windows .exe
)。
但是,在某些Linux系统上,可能仍然希望省略对例如wayland、x11或libei的支持。
这可以通过cargo功能来实现。
例如,如果只需要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 dlls。
-
首先安装Rust。
-
然后按照gtk-rs.org中的说明进行操作。
TLDR
从源代码构建gtk
- 以下命令应在管理员powershell实例中运行
# install chocolatey
Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
# install gvsbuild dependencies
choco install python git msys2 visualstudio2022-workload-vctools
- 以下命令应在常规powershell实例中运行
# install gvsbuild with python
python -m pip install --user pipx
python -m pipx ensurepath
- 重新启动您的powershell实例,以便反映环境中的更改。
pipx install gvsbuild
# build 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/
。
要创建此文件,您可以复制以下示例配置
示例配置
[!TIP] 发布绑定的键符号名称根据其在 src/scancode.rs#L172 中的名称命名。这将发生变化
# example configuration
# configure release bind
release_bind = [ "KeyA", "KeyS", "KeyD", "KeyF" ]
# optional port (defaults to 4242)
port = 4242
# # optional frontend -> defaults to gtk if available
# # possible values are "cli" and "gtk"
# frontend = "gtk"
# define a client on the right side with host name "iridium"
[right]
# hostname
hostname = "iridium"
# activate this client immediately when lan-mouse is started
activate_on_startup = true
# optional list of (known) ip addresses
ips = ["192.168.178.156"]
# define a client on the left side with IP address 192.168.178.189
[left]
# The hostname is optional: When no hostname is specified,
# at least one ip address needs to be specified.
hostname = "thorium"
# ips for ethernet and wifi
ips = ["192.168.178.189", "192.168.178.172"]
# optional port
port = 4242
其中 left
可以是 left
、right
、top
或 bottom
。
路线图
- 图形前端(gtk + libadwaita)
- 尊重 xdg-config-home 配置文件位置。
- IP 地址切换
- 活跃度跟踪:自动在客户端不可达时释放鼠标
- 活跃度跟踪:当服务器离线时自动释放键
- MacOS 键码转换
- Libei 输入捕获
- X11 输入捕获
- Windows 输入捕获
- MacOS 输入捕获
- 延迟测量和可视化
- 带宽使用测量和可视化
- 剪贴板支持
- 加密
协议
由于性能原因,目前 所有 鼠标和键盘事件都通过 UDP 发送。每个事件都作为一个单独的数据报发送,目前没有任何确认以确保 0% 的数据包丢失。这意味着,任何丢失的数据包都会导致鼠标/键盘事件被丢弃,目前被忽略。
UDP 的另一个好处是无需重新连接逻辑。任何客户端都可以离线,一旦上线,它将立即重新开始工作。
此外,还可以通过 tcp 连接请求托管在 tcp 服务器上的需要可靠发送的数据(例如,来自服务器的键盘布局或未来的剪贴板内容)。
带宽考虑
最多的带宽被鼠标事件占用。典型的办公鼠标具有 125Hz 的轮询率,而游戏鼠标通常具有更高的轮询率,如 1000Hz。鼠标事件由 21 字节组成
- 1 字节用于事件类型枚举,
- 4 字节(u32)用于时间戳,
- 8 字节(f64)用于 dx,
- 8 字节(f64)用于 dy。
此外,IP 头部占用 20 字节,UDP 头部占用 8 字节,总共占用另外 28 字节。因此,对于 1000Hz 的游戏鼠标,总共有 49 * 1000 字节/秒。这使高端游戏鼠标的总带宽需求为 392 kbit/s,即使对于高端游戏鼠标也是如此。因此,带宽不是一个问题。
服务器通过在相同端口上监听 tcp 提供更大的数据块,例如键盘布局。这样我们就不需要实现任何拥塞控制,而将此留给 tcp。将来这可以用于例如剪贴板内容。
每秒数据包数
在局域网中性能出色,但一些无线网卡似乎在每秒处理的包量上有些吃力,尤其是在具有1000Hz+轮询率的高端游戏鼠标上。
计划实现一种累积包并作为一个单独的按键事件发送的方式,以降低包率(实际上是通过人工降低轮询率)。
目前发送移动数据的方式也相当浪费,因为即使是16位整数也足以表示最快的鼠标移动。对于像Protocol Buffers这样的更有效的编码方式(适用于较小的值),对于未来和WIFI连接来说将是一个更好的选择。
安全性
在本地网络上发送按键和鼠标事件数据可能不是最大的安全担忧,但在任何公共网络或商业环境中,基本广播你的按键是一个相当严重的问题。
- 应在应用层下方添加加密层,以启用安全连接。
- 加密密钥可以由图形前端生成。
Wayland支持
输入仿真(用于接收事件)
截至撰写本文时,wayland输入仿真仍处于早期/不稳定状态。
因此,根据活动的桌面环境/合成器选择合适的后端。
不同的合成器有不同的启用输入仿真的方式
Wlroots
大多数基于wlroots的合成器,如Hyprland和Sway,支持以下不稳定的wayland协议,用于键盘和鼠标仿真
KDE
KDE还有一个用于输入仿真的协议(kde-fake-input),但它并未对第三方应用程序公开。
在KDE上仿真输入的推荐方法是freedesktop remote-desktop-portal。
Gnome
Gnome使用libei进行输入仿真和捕获,其目标是成为在Wayland上仿真和捕获输入的通用方法。
输入捕获
要捕获鼠标和键盘输入,需要一些东西
- 在屏幕边缘显示不可移动的表面
- 锁定鼠标位置
- (可选但强烈推荐)读取未加速的鼠标输入
所需协议(事件发射) | Sway | Kwin | Gnome |
---|---|---|---|
pointer-constraints-unstable-v1 | ✔️ | ✔️ | ✔️ |
relative-pointer-unstable-v1 | ✔️ | ✔️ | ✔️ |
keyboard-shortcuts-inhibit-unstable-v1 | ✔️ | ✔️ | ✔️ |
wlr-layer-shell-unstable-v1 | ✔️ | ✔️ | ❌ |
需要zwlr_virtual_pointer_manager_v1来在屏幕边缘显示表面,并用于在基于wlroots的合成器和KDE上显示不可移动的窗口。
不幸的是,Gnome不支持此协议,并且可能永远不会支持它。
为了使layershell表面能够使用pointer_constraints协议锁定指针,需要在sway上应用此补丁(此功能在sway版本>= 1.8时为原生支持)
依赖项
~26–58MB
~1M SLoC