#mouse #mouse-input #sharing #keyboard #keyboard-input #wayland #gtk

bin+lib lan-mouse

软件 KVM 切换器 / 局域网鼠标和键盘共享软件

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 网络编程

Download history 88/week @ 2024-04-26 30/week @ 2024-05-03 32/week @ 2024-05-10 235/week @ 2024-05-17 39/week @ 2024-05-24 55/week @ 2024-05-31 49/week @ 2024-06-07 45/week @ 2024-06-14 39/week @ 2024-06-21 32/week @ 2024-06-28 42/week @ 2024-07-05 37/week @ 2024-07-12 25/week @ 2024-07-19 230/week @ 2024-07-26 76/week @ 2024-08-02 45/week @ 2024-08-09

每月383次下载

GPL-3.0 或更高版本

365KB
9K SLoC

Lan Mouse

Lan Mouse 是一款类似于 Apple 设备上的 universal-control 的鼠标和键盘共享软件。它允许使用一套鼠标和键盘来使用多台电脑。这也可以称为软件 KVM 切换器。

主要目标是 Linux 上的 Wayland,但 Windows 和 MacOS 以及 Xorg 上的 Linux 也部分支持(详细信息见下文)。

  • 现在带有 gtk 前端

此项目的目标是成为像 Synergy 2/3Share 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

手动安装

首先确保安装必要的依赖项

以发布模式构建

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 可以是 leftrighttopbottom

路线图

  • 图形前端(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