Blub / netevent

Input-Event device cloning utility. Use it together with ssh/netcat/... to share input devices among different machines.
GNU General Public License v2.0
148 stars 14 forks source link

error opening uinput device: Permission denied #13

Closed frague59 closed 4 years ago

frague59 commented 4 years ago

Hi, I'm trying to use netevent on a brand new debian bullseye install, but it fails all the time, with permissions issue on uinput. I've to notice I've used netevent before on a previous bullseye system (which evolved from buster), it worked nice... I use netevent to share my kb/mouse attached to my professional PC (I'm a python dev) with my personal laptop.

daemon settings

$ cat /etc/netevent/netevent.ne2
# Mouse and keyboard
device add mymouse /dev/input/by-id/usb-PixArt_Dell_MS116_USB_Optical_Mouse-event-mouse
# device add mymouse /dev/input/by-id/usb-YSTEK_G_Mouse-event-mouse
device add mykbd   /dev/input/by-id/usb-413c_Dell_KB216_Wired_Keyboard-event-kbd

# Add toggle hotkey (on press, and ignore the release event)
hotkey add mykbd key:97:1 grab toggle
hotkey add mykbd key:97:0 nop

# Connect to the two devices via password-less ssh
output add myremote exec:ssh <laptop-user>@<laptop-name>.local netevent create
# Cause grabbing to write to that output
use myremote

uinput perms

$ ls -la /dev/uinput
crw------- 1 root root 10, 223 janv. 21 08:13 /dev/uinput

daemon launching

# netevent daemon -s /etc/netevent/netevent.ne2 ./netevent-command.sock
added device mymouse
added device mykbd
added hotkey 1:97:1 for device 1
added hotkey 1:97:0 for device 1
added output myremote
error: error opening uinput device: Permission denied
interrupted

systemd service file

$ cat /etc/systemd/system/netevent.service
[Unit]
Description=Netevent mouse / keyboard sharing
After=network-online.target

[Service]
Type=simple
RemainAfterExit=yes
ExecStart=/usr/local/bin/netevent daemon -s /etc/netevent/netevent.ne2 /run/netevent.socket

[Install]
WantedBy=multi-user.target

Thanks for you great software and for your help !

Blub commented 4 years ago

It looks like you're running this as root, so the permission error doesn't make much sense, unless you're in a container with some LSM blocking access to /dev/uinput? Could you post an strace output of the above netevent daemon command (and check if there are any journal audit messages popping up during execution)?

frague59 commented 4 years ago
strace netevent daemon -s /etc/netevent/netevent.ne2 ./netevent-comand.sock
execve("/usr/local/bin/netevent", ["netevent", "daemon", "-s", "/etc/netevent/netevent.ne2", "./netevent-comand.sock"], 0x7fff16e460d0 /* 20 vars */) = 0
brk(NULL)                               = 0x561d1488b000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (Aucun fichier ou dossier de ce type)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=115350, ...}) = 0
mmap(NULL, 115350, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fa9b7212000
close(3)                                = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0@\237\t\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=1919784, ...}) = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fa9b7210000
mmap(NULL, 1934752, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fa9b7037000
mmap(0x7fa9b70cd000, 950272, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x96000) = 0x7fa9b70cd000
mmap(0x7fa9b71b5000, 303104, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x17e000) = 0x7fa9b71b5000
mmap(0x7fa9b71ff000, 57344, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1c7000) = 0x7fa9b71ff000
mmap(0x7fa9b720d000, 9632, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fa9b720d000
close(3)                                = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libgcc_s.so.1", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0203\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=100736, ...}) = 0
mmap(NULL, 103504, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fa9b701d000
mmap(0x7fa9b7020000, 69632, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x3000) = 0x7fa9b7020000
mmap(0x7fa9b7031000, 16384, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x14000) = 0x7fa9b7031000
mmap(0x7fa9b7035000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x17000) = 0x7fa9b7035000
close(3)                                = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\320l\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1820104, ...}) = 0
mmap(NULL, 1832568, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fa9b6e5d000
mprotect(0x7fa9b6e82000, 1642496, PROT_NONE) = 0
mmap(0x7fa9b6e82000, 1339392, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x25000) = 0x7fa9b6e82000
mmap(0x7fa9b6fc9000, 299008, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x16c000) = 0x7fa9b6fc9000
mmap(0x7fa9b7013000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1b5000) = 0x7fa9b7013000
mmap(0x7fa9b7019000, 13944, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fa9b7019000
close(3)                                = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libm.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\340\361\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=1325424, ...}) = 0
mmap(NULL, 1327360, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fa9b6d18000
mmap(0x7fa9b6d27000, 634880, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xf000) = 0x7fa9b6d27000
mmap(0x7fa9b6dc2000, 626688, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xaa000) = 0x7fa9b6dc2000
mmap(0x7fa9b6e5b000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x142000) = 0x7fa9b6e5b000
close(3)                                = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fa9b6d16000
arch_prctl(ARCH_SET_FS, 0x7fa9b6d170c0) = 0
mprotect(0x7fa9b7013000, 12288, PROT_READ) = 0
mprotect(0x7fa9b6e5b000, 4096, PROT_READ) = 0
mprotect(0x7fa9b7035000, 4096, PROT_READ) = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fa9b6d14000
mprotect(0x7fa9b71ff000, 45056, PROT_READ) = 0
mprotect(0x561d136ce000, 4096, PROT_READ) = 0
mprotect(0x7fa9b7257000, 4096, PROT_READ) = 0
munmap(0x7fa9b7212000, 115350)          = 0
brk(NULL)                               = 0x561d1488b000
brk(0x561d148ac000)                     = 0x561d148ac000
rt_sigaction(SIGINT, {sa_handler=0x561d1369cf42, sa_mask=[INT], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7fa9b6e97100}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
rt_sigaction(SIGTERM, {sa_handler=0x561d1369cf42, sa_mask=[TERM], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7fa9b6e97100}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
rt_sigaction(SIGQUIT, {sa_handler=0x561d1369cf42, sa_mask=[QUIT], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7fa9b6e97100}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
rt_sigaction(SIGCHLD, {sa_handler=0x561d1369cf42, sa_mask=[CHLD], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7fa9b6e97100}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
rt_sigaction(SIGPIPE, {sa_handler=SIG_IGN, sa_mask=[PIPE], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7fa9b6e97100}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
unlink("./netevent-comand.sock")        = -1 ENOENT (Aucun fichier ou dossier de ce type)
socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC, 0) = 3
unlink("./netevent-comand.sock")        = -1 ENOENT (Aucun fichier ou dossier de ce type)
bind(3, {sa_family=AF_UNIX, sun_path="./netevent-comand.sock"}, 110) = 0
listen(3, 5)                            = 0
openat(AT_FDCWD, "/etc/netevent/netevent.ne2", O_RDONLY|O_CLOEXEC) = 4
fstat(4, {st_mode=S_IFREG|0644, st_size=562, ...}) = 0
read(4, "# Mouse and keyboard\ndevice add "..., 4096) = 562
openat(AT_FDCWD, "/dev/input/by-id/usb-PixArt_Dell_MS116_USB_Optical_Mouse-event-mouse", O_RDONLY|O_CLOEXEC) = 5
ioctl(5, EVIOCGNAME(80), "PixArt Dell MS116 USB Optical Mo"...) = 36
ioctl(5, EVIOCGID, {ID_BUS=3, ID_VENDOR=16700, ID_PRODUCT=12314, ID_VERSION=273}) = 0
ioctl(5, EVIOCGBIT(0, 4), [EV_SYN, EV_KEY, EV_REL, EV_MSC]) = 4
write(2, "added device mymouse\n", 21added device mymouse
)  = 21
openat(AT_FDCWD, "/dev/input/by-id/usb-413c_Dell_KB216_Wired_Keyboard-event-kbd", O_RDONLY|O_CLOEXEC) = 6
ioctl(6, EVIOCGNAME(80), "Dell KB216 Wired Keyboard\0") = 26
ioctl(6, EVIOCGID, {ID_BUS=3, ID_VENDOR=16700, ID_PRODUCT=8467, ID_VERSION=273}) = 0
ioctl(6, EVIOCGBIT(0, 4), [EV_SYN, EV_KEY, EV_MSC, EV_LED, ...]) = 4
write(2, "added device mykbd\n", 19added device mykbd
)    = 19
write(2, "added hotkey 1:97:1 for device 1"..., 33added hotkey 1:97:1 for device 1
) = 33
write(2, "added hotkey 1:97:0 for device 1"..., 33added hotkey 1:97:0 for device 1
) = 33
pipe2([7, 8], O_CLOEXEC)                = 0
clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fa9b6d17390) = 4937
close(7)                                = 0
write(8, "\0\4\0\2NE2Hello\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 28) = 28
writev(8, [{iov_base="\0\1\0\1\4\\\0P\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", iov_len=28}, {iov_base="Dell KB216 Wired Keyboard\0\0\0\0\0\0\0"..., iov_len=80}, {iov_base="\0\3A<!\23\1\21", iov_len=8}, {iov_base="\0\37", iov_len=2}, {iov_base="\23\0\22\0", iov_len=4}], 5) = 122
ioctl(6, EVIOCGBIT(EV_KEY, 96), [KEY_ESC, KEY_1, KEY_2, KEY_3, ...]) = 96
writev(8, [{iov_base="\3\0", iov_len=2}, {iov_base="\376\377\377\377\377\377\377\377\377\377\357\377\337\377\276\376\377W@\301z \237\377\7\0\0\0\0\0\1\0"..., iov_len=96}], 2) = 98
ioctl(6, EVIOCGBIT(EV_MSC, 8), [MSC_SCAN]) = 8
writev(8, [{iov_base="\0@", iov_len=2}, {iov_base="\20\0\0\0\0\0\0\0", iov_len=8}], 2) = 10
ioctl(6, EVIOCGBIT(EV_LED, 8), [LED_NUML, LED_CAPSL, LED_SCROLLL, LED_COMPOSE, ...]) = 8
writev(8, [{iov_base="\0@", iov_len=2}, {iov_base="\37\0\0\0\0\0\0\0", iov_len=8}], 2) = 10
write(8, "\0\0\0\0", 4)                 = 4
writev(8, [{iov_base="\0\1\0\0\4\\\0P\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", iov_len=28}, {iov_base="PixArt Dell MS116 USB Optical Mo"..., iov_len=80}, {iov_base="\0\3A<0\32\1\21", iov_len=8}, {iov_base="\0\37", iov_len=2}, {iov_base="\27\0\0\0", iov_len=4}], 5) = 122
ioctl(5, EVIOCGBIT(EV_KEY, 96), [BTN_LEFT, BTN_RIGHT, BTN_MIDDLE]) = 96
writev(8, [{iov_base="\3\0", iov_len=2}, {iov_base="\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., iov_len=96}], 2) = 98
ioctl(5, EVIOCGBIT(EV_REL, 8), [REL_X, REL_Y, REL_WHEEL, REL_WHEEL_HI_RES]) = 8
writev(8, [{iov_base="\0@", iov_len=2}, {iov_base="\3\t\0\0\0\0\0\0", iov_len=8}], 2) = 10
ioctl(5, EVIOCGBIT(EV_MSC, 8), [MSC_SCAN]) = 8
writev(8, [{iov_base="\0@", iov_len=2}, {iov_base="\20\0\0\0\0\0\0\0", iov_len=8}], 2) = 10
write(8, "\0\0\0\0", 4)                 = 4
write(2, "added output myremote\n", 22added output myremote
) = 22
read(4, "", 4096)                       = 0
close(4)                                = 0
poll([{fd=3, events=POLLIN|POLLERR|POLLHUP}, {fd=5, events=POLLIN|POLLERR|POLLHUP}, {fd=6, events=POLLIN|POLLERR|POLLHUP}], 3, -1) = 1 ([{fd=6, revents=POLLIN}])
read(6, "\221I)^\0\0\0\0a\204\16\0\0\0\0\0\4\0\4\0(\0\7\0", 24) = 24
poll([{fd=3, events=POLLIN|POLLERR|POLLHUP}, {fd=5, events=POLLIN|POLLERR|POLLHUP}, {fd=6, events=POLLIN|POLLERR|POLLHUP}], 3, -1) = 1 ([{fd=6, revents=POLLIN}])
read(6, "\221I)^\0\0\0\0a\204\16\0\0\0\0\0\1\0\34\0\0\0\0\0", 24) = 24
poll([{fd=3, events=POLLIN|POLLERR|POLLHUP}, {fd=5, events=POLLIN|POLLERR|POLLHUP}, {fd=6, events=POLLIN|POLLERR|POLLHUP}], 3, -1) = 1 ([{fd=6, revents=POLLIN}])
read(6, "\221I)^\0\0\0\0a\204\16\0\0\0\0\0\0\0\0\0\0\0\0\0", 24) = 24
poll([{fd=3, events=POLLIN|POLLERR|POLLHUP}, {fd=5, events=POLLIN|POLLERR|POLLHUP}, {fd=6, events=POLLIN|POLLERR|POLLHUP}], 3, -1error: error opening uinput device: Permission denied
) = ? ERESTART_RESTARTBLOCK (Interrupted by signal)
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=4937, si_uid=0, si_status=2, si_utime=0, si_stime=0} ---
wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 2}], WNOHANG, NULL) = 4937
wait4(-1, 0x7fffab400fec, WNOHANG, NULL) = -1 ECHILD (Aucun processus enfant)
rt_sigreturn({mask=[]})                 = -1 EINTR (Appel système interrompu)
write(2, "interrupted\n", 12interrupted
)           = 12
poll([{fd=3, events=POLLIN|POLLERR|POLLHUP}, {fd=5, events=POLLIN|POLLERR|POLLHUP}, {fd=6, events=POLLIN|POLLERR|POLLHUP}], 3, -1) = 1 ([{fd=6, revents=POLLIN}])
read(6, "\242I)^\0\0\0\0\356\17\2\0\0\0\0\0\4\0\4\0\340\0\7\0", 24) = 24
poll([{fd=3, events=POLLIN|POLLERR|POLLHUP}, {fd=5, events=POLLIN|POLLERR|POLLHUP}, {fd=6, events=POLLIN|POLLERR|POLLHUP}], 3, -1) = 1 ([{fd=6, revents=POLLIN}])
read(6, "\242I)^\0\0\0\0\356\17\2\0\0\0\0\0\1\0\35\0\1\0\0\0", 24) = 24
poll([{fd=3, events=POLLIN|POLLERR|POLLHUP}, {fd=5, events=POLLIN|POLLERR|POLLHUP}, {fd=6, events=POLLIN|POLLERR|POLLHUP}], 3, -1) = 1 ([{fd=6, revents=POLLIN}])
read(6, "\242I)^\0\0\0\0\356\17\2\0\0\0\0\0\0\0\0\0\0\0\0\0", 24) = 24
poll([{fd=3, events=POLLIN|POLLERR|POLLHUP}, {fd=5, events=POLLIN|POLLERR|POLLHUP}, {fd=6, events=POLLIN|POLLERR|POLLHUP}], 3, -1) = 1 ([{fd=6, revents=POLLIN}])
read(6, "\242I)^\0\0\0\0JJ\6\0\0\0\0\0\1\0\35\0\2\0\0\0", 24) = 24
poll([{fd=3, events=POLLIN|POLLERR|POLLHUP}, {fd=5, events=POLLIN|POLLERR|POLLHUP}, {fd=6, events=POLLIN|POLLERR|POLLHUP}], 3, -1) = 1 ([{fd=6, revents=POLLIN}])
read(6, "\242I)^\0\0\0\0JJ\6\0\0\0\0\0\0\0\0\0\1\0\0\0", 24) = 24
poll([{fd=3, events=POLLIN|POLLERR|POLLHUP}, {fd=5, events=POLLIN|POLLERR|POLLHUP}, {fd=6, events=POLLIN|POLLERR|POLLHUP}], 3, -1) = 1 ([{fd=6, revents=POLLIN}])
read(6, "\242I)^\0\0\0\0JJ\6\0\0\0\0\0\1\0\35\0\2\0\0\0", 24) = 24
poll([{fd=3, events=POLLIN|POLLERR|POLLHUP}, {fd=5, events=POLLIN|POLLERR|POLLHUP}, {fd=6, events=POLLIN|POLLERR|POLLHUP}], 3, -1) = 1 ([{fd=6, revents=POLLIN}])
read(6, "\242I)^\0\0\0\0JJ\6\0\0\0\0\0\0\0\0\0\1\0\0\0", 24) = 24
poll([{fd=3, events=POLLIN|POLLERR|POLLHUP}, {fd=5, events=POLLIN|POLLERR|POLLHUP}, {fd=6, events=POLLIN|POLLERR|POLLHUP}], 3, -1) = 1 ([{fd=6, revents=POLLIN}])
read(6, "\242I)^\0\0\0\0JJ\6\0\0\0\0\0\4\0\4\0\6\0\7\0", 24) = 24
poll([{fd=3, events=POLLIN|POLLERR|POLLHUP}, {fd=5, events=POLLIN|POLLERR|POLLHUP}, {fd=6, events=POLLIN|POLLERR|POLLHUP}], 3, -1) = 1 ([{fd=6, revents=POLLIN}])
read(6, "\242I)^\0\0\0\0JJ\6\0\0\0\0\0\1\0.\0\1\0\0\0", 24) = 24
poll([{fd=3, events=POLLIN|POLLERR|POLLHUP}, {fd=5, events=POLLIN|POLLERR|POLLHUP}, {fd=6, events=POLLIN|POLLERR|POLLHUP}], 3, -1) = 1 ([{fd=6, revents=POLLIN}])
read(6, "\242I)^\0\0\0\0JJ\6\0\0\0\0\0\0\0\0\0\0\0\0\0", 24) = 24
poll([{fd=3, events=POLLIN|POLLERR|POLLHUP}, {fd=5, events=POLLIN|POLLERR|POLLHUP}, {fd=6, events=POLLIN|POLLERR|POLLHUP}], 3, -1^C) = ? ERESTART_RESTARTBLOCK (Interrupted by signal)
strace: Process 4936 detached
interrupted
shutting down
Blub commented 4 years ago

Ah, I should've seen earlier that the issue is not on the daemon side (that side doesn't even need /dev/uinput), but on the remote side where you run netevent create. Your <laptop-user>@<laptop-name>.local doesn't seem to have access to /dev/uinput on the laptop. You should check the /dev/uinput permissions on the laptop side.

frague59 commented 4 years ago

Which permission can I give and how ?

frague59 commented 4 years ago

I've got it ! I've used this:

https://github.com/chrippa/ds4drv/issues/93#issuecomment-265300511

To set perms on /dev/uinput on the laptop.