From ffb0fa434976a48b13424be453a4997df0259712 Mon Sep 17 00:00:00 2001 From: rustdesk Date: Tue, 8 Mar 2022 15:42:58 +0800 Subject: [PATCH] pynput run as user --- libs/enigo/src/linux.rs | 22 +++++++++++++++++----- pynput_service.py | 1 + src/platform/linux.rs | 2 +- src/server/input_service.rs | 11 ++++++++++- src/ui/remote.rs | 2 +- 5 files changed, 30 insertions(+), 8 deletions(-) diff --git a/libs/enigo/src/linux.rs b/libs/enigo/src/linux.rs index 61b11ddec..5d238219d 100644 --- a/libs/enigo/src/linux.rs +++ b/libs/enigo/src/linux.rs @@ -494,12 +494,24 @@ fn start_pynput_service(rx: mpsc::Receiver<(PyMsg, bool)>) { } log::info!("pynput service: {}", py); std::thread::spawn(move || { - log::error!( - "pynput server exit: {:?}", + let username = std::env::var("PYNPUT_USERNAME").unwrap_or("".to_owned()); + let userid = std::env::var("PYNPUT_USERID").unwrap_or("".to_owned()); + let status = if username.is_empty() { std::process::Command::new("python3") - .arg("./pynput_service.py") - .arg(IPC_FILE) - .status() + .arg(&py) + .arg(IPC_FILE).status() + } else { + std::process::Command::new("sudo").args(vec![ + &format!("XDG_RUNTIME_DIR=/run/user/{}", userid) as &str, + "-u", + &username, + "python3", + &py, + IPC_FILE, + ]).status() + }; + log::info!( + "pynput server exit: {:?}", status ); unsafe { PYNPUT_EXIT = true; diff --git a/pynput_service.py b/pynput_service.py index a3da93037..9df7f974f 100644 --- a/pynput_service.py +++ b/pynput_service.py @@ -22,6 +22,7 @@ server = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) server.bind(server_address) server.listen(1) clientsocket, address = server.accept() +os.system('chmod a+rw %s'%server_address) print("Got pynput connection") diff --git a/src/platform/linux.rs b/src/platform/linux.rs index a376c9df0..aad541706 100644 --- a/src/platform/linux.rs +++ b/src/platform/linux.rs @@ -243,7 +243,7 @@ pub fn start_os_service() { log::info!("Exit"); } -fn get_active_userid() -> String { +pub fn get_active_userid() -> String { get_value_of_seat0(1) } diff --git a/src/server/input_service.rs b/src/server/input_service.rs index 93d2ee85b..7936bcc7a 100644 --- a/src/server/input_service.rs +++ b/src/server/input_service.rs @@ -165,7 +165,16 @@ fn run_cursor(sp: MouseCursorService, state: &mut StateCursor) -> ResultType<()> } lazy_static::lazy_static! { - static ref ENIGO: Arc> = Arc::new(Mutex::new(Enigo::new())); + static ref ENIGO: Arc> = { + #[cfg(target_os = "linux")] + { + if crate::platform::is_root() { + std::env::set_var("PYNPUT_USERNAME", crate::platform::linux::get_active_username()); + std::env::set_var("PYNPUT_USERID", crate::platform::linux::get_active_userid()); + } + } + Arc::new(Mutex::new(Enigo::new())) + }; static ref KEYS_DOWN: Arc>> = Default::default(); static ref LATEST_INPUT: Arc> = Default::default(); } diff --git a/src/ui/remote.rs b/src/ui/remote.rs index abc3b7fdc..8958f7232 100644 --- a/src/ui/remote.rs +++ b/src/ui/remote.rs @@ -353,7 +353,7 @@ impl Handler { Key::Kp8 => Some(ControlKey::Numpad8), Key::Kp9 => Some(ControlKey::Numpad9), Key::KpDivide => Some(ControlKey::Divide), - Key::KpMultiply => Some(ControlKey::Subtract), + Key::KpMultiply => Some(ControlKey::Multiply), Key::KpDecimal => Some(ControlKey::Decimal), Key::KpMinus => Some(ControlKey::Subtract), Key::KpPlus => Some(ControlKey::Add),