feschber/lan-mouse 是一个托管在 GitHub 上的开源项目,主要使用 Rust 编写,采用 GNU General Public License v3.0 许可证,目前获得 5.5k 个 Star、319 次 Fork。
仓库全名
feschber/lan-mouse
开源许可证
GNU General Public License v3.0
Star 数
5.5k
Fork 数
319
未关闭 Issue
159
README 摘要
Lan Mouse Lan Mouse is a cross-platform mouse and keyboard sharing software similar to universal-control on Apple devices. It allows for using multiple PCs via a single set of mouse and keyboard. This is also known as a Software KVM switch. Goal of this project is to be an open-source alternative to proprietary tools like Synergy 2/3, Share Mouse and other open source tools like Deskflow or Input Leap (Synergy…
Lan Mouse is a cross-platform mouse and keyboard sharing software similar to universal-control on Apple devices.
It allows for using multiple PCs via a single set of mouse and keyboard.
This is also known as a Software KVM switch.
Goal of this project is to be an open-source alternative to proprietary tools like Synergy 2/3, Share Mouse
and other open source tools like Deskflow or Input Leap (Synergy fork).
Focus lies on performance, ease of use and a maintainable implementation that can be expanded to support additional backends for e.g. Android, iOS, … in the future.
blazingly fast™ because it’s written in rust.
Now with a gtk frontend
Encryption
Lan Mouse encrypts all network traffic using the DTLS implementation provided by WebRTC.rs.
There are currently no mitigations in place for timing side-channel attacks.
OS Support
Most current desktop environments and operating systems are fully supported, this includes
GNOME >= 45
KDE Plasma >= 6.1
Most wlroots based compositors, including Sway (>= 1.8), Hyprland and Wayfire
Windows
MacOS
Caveats / Known Issues
Important 重要
X11 currently only has support for input emulation, i.e. can only be used on the receiving end.
Sway / wlroots: Wlroots based compositors without libei support on the receiving end currently do not handle modifier events on the client side.
This results in CTRL / SHIFT / ALT / SUPER keys not working with a sending device that is NOT using the layer-shell backend
Wayfire: If you are using Wayfire, make sure to use a recent version (must be newer than October 23rd) and add shortcuts-inhibit to the list of plugins in your wayfire config!
Otherwise input capture will not work.
Windows: The mouse cursor will be invisible when sending input to a Windows system if
there is no real mouse connected to the machine.
A proof of concept for an Android / IOS Application by rohitsangwan01 can be found here.
It can be used as a remote control for any device supported by Lan Mouse.
Precompiled release binaries for Windows, MacOS and Linux are available in the releases section.
For Windows, the depenedencies are included in the .zip file, for other operating systems see Installing Dependencies.
Alternatively, the lan-mouse binary can be compiled from source (see below).
Installing desktop file, app icon and firewall rules (optional)
# install lan-mouse (replace path/to/ with the correct path)
sudo cp path/to/lan-mouse /usr/local/bin/
# install app icon
sudo mkdir -p /usr/local/share/icons/hicolor/scalable/apps
sudo cp lan-mouse-gtk/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
Instead of downloading from the releases, the lan-mouse binary
can be easily compiled via cargo or nix:
# will end up in ~/.cargo/bin
cargo install lan-mouse
Compiling and installing via nix:
# you can find the executable in result/bin/lan-mouse
nix-build
Conditional compilation
Support for other platforms is omitted automatically based on the active
rust toolchain.
Additionally, available backends and frontends can be configured manually via
cargo features.
E.g. if only support for sway is needed, the following command produces
an executable with support for only the layer-shell capture backend
and wlroots emulation backend:
For a detailed list of available features, checkout the Cargo.toml
Development
Git pre-commit hook
This repository includes a local git hooks directory .githooks/ with a pre-commit script that enforces formatting, lints, and tests before allowing a commit. It is optional to enable it, but it will prevent you from committing code with failing unit tests or that needs clippy/fmt fixes. To enable the hook locally:
Make the hook executable:
chmod +x .githooks/pre-commit
Point git to the hooks directory (one-time per clone):
git config core.hooksPath .githooks
The pre-commit script runs cargo fmt --all (and fails if files were modified), cargo clippy --workspace --all-targets --all-features -- -D warnings, and cargo test --workspace --all-features.
Dependencies & Compiling from Source
MacOS
# Install dependencies
brew install libadwaita pkg-config imagemagick
cargo install cargo-bundle
# Create the macOS icon file
scripts/makeicns.sh
# Create the .app bundle
cargo bundle
# Copy all dynamic libraries into the bundle, and update the bundle to find them there
scripts/copy-macos-dylib.sh
Make sure to add the directoryC:\gtk-build\gtk\x64\release\binto the PATH environment variable. Otherwise the project will fail to build.
To avoid building GTK from source, it is possible to disable
the gtk frontend (see conditional compilation).
Usage
Gtk Frontend
By default the gtk frontend will open when running lan-mouse.
To connect a device you want to control, simply click the Add button and enter the hostname
of the device.
On the remote device, authorize your local device for incoming traffic using the Authorize button
under the “Incoming Connections” section.
The fingerprint for authorization can be found under the general section of your local device.
It is of the form “aa:bb:cc:…”
Authorized devices can be persisted using the configuration file (see Configuration).
If the device still can not be entered, make sure you have UDP port 4242 (or the one selected) opened up in your firewall.
Command Line Interface
The cli interface can be accessed by passing cli as a commandline argument.
Use
lan-mouse cli help
to list the available commands and
lan-mouse cli <cmd> help
for information on how to use a specific command.
Daemon Mode
Lan Mouse can be launched in daemon mode to keep it running in the background (e.g. for use in a systemd-service).
To do so, use the daemon subcommand:
lan-mouse daemon
Systemd Service
In order to start lan-mouse with a graphical session automatically,
the systemd-service can be used:
Copy the file to ~/.config/systemd/user/ and enable the service:
Make sure to point ExecStart=/usr/bin/lan-mouse daemon to the actual lan-mouse binary (in case it is not under /usr/bin, e.g. when installed manually.
Configuration
To automatically load clients on startup, the file $XDG_CONFIG_HOME/lan-mouse/config.toml is parsed.
$XDG_CONFIG_HOME defaults to ~/.config/.
To create this file you can copy the following example config:
Example config
[!TIP]
key symbols in the release bind are named according
to their names in input-event/src/scancode.rs#L172.
This is bound to change
# example configuration
# configure release bind
release_bind = [ "KeyA", "KeyS", "KeyD", "KeyF" ]
# optional port (defaults to 4242)
port = 4242
# list of authorized tls certificate fingerprints that
# are accepted for incoming traffic
[authorized_fingerprints]
"bc:05:ab:7a:a4:de:88:8c:2f:92:ac:bc:b8:49:b8:24:0d:44:b3:e6:a4:ef:d7:0b:6c:69:6d:77:53:0b:14:80" = "iridium"
# define a client on the right side with host name "iridium"
[[clients]]
# position (left | right | top | bottom)
position = "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
[[clients]]
position = "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
Where left can be either left, right, top or bottom.
Roadmap
Graphical frontend (gtk + libadwaita)
respect xdg-config-home for config file location.
IP Address switching
Liveness tracking Automatically ungrab mouse when client unreachable
Liveness tracking: Automatically release keys, when server offline
MacOS KeyCode Translation
Libei Input Capture
MacOS Input Capture
Windows Input Capture
Encryption
X11 Input Capture
Latency measurement and visualization
Bandwidth usage measurement and visualization
Clipboard support
Detailed OS Support
In order to use a device for sending events, an input-capture backend is required, while receiving events requires
a supported input-emulationandinput-capture backend.
A suitable backend is chosen automatically based on the active desktop environment / compositor.
The following sections detail the emulation and capture backends provided by lan-mouse and their support in desktop environments / operating systems.
评论