Wyłącz wprowadzanie z klawiatury i myszy na Uniksie (poniżej X)

28

Jak można programowo „zamrozić” klawiaturę i mysz, aby nikt nie mógł zepsuć się z systemem?

Jest kilka możliwości, w których jest to przydatne. Na przykład mam laptopa i chcę się upewnić, że nikt go nie użyje podczas wychodzenia, nawet jeśli ktoś zna hasło lub może je odgadnąć (jak żona lub dzieci), a także obniża apetyt złodziei (jak się wydaje -funkcjonowanie). lub robię coś zdalnie, więc chcę mieć pewność, że użytkownik komputera nie będzie przeszkadzał.

Philomath
źródło
4
Powiązane: podobne pytanie w OSX
Gilles „SO- przestań być zły”

Odpowiedzi:

24

Zakładając, że twój GUI jest oparty na X (jak prawie wszystkie GUI UNIX), użyj xinput.

Najpierw wypisz swoje urządzenia:

$ xinput --list
⎡ Virtual core pointer                          id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Windows mouse                             id=6    [slave  pointer  (2)]
⎣ Virtual core keyboard                         id=3    [master keyboard (2)]
↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
↳ Windows keyboard                          id=7    [slave  keyboard (3)]

Podaj szczegóły dotyczące myszy (id = 6 w naszym przykładzie):

$ xinput --list-props 6
Device 'Windows mouse':
    Device Enabled (112):   1
    Coordinate Transformation Matrix (114): 1.000000, 0.000000, 0.000000, 0.000000,   1.000000, 0.000000, 0.000000, 0.000000, 1.000000
    Device Accel Profile (222):     0
    Device Accel Constant Deceleration (223):       1.000000
    Device Accel Adaptive Deceleration (224):       1.000000
    Device Accel Velocity Scaling (225):    10.000000

Teraz wyłącz:

$ export DISPLAY=:0
$ xinput set-int-prop 6 "Device Enabled" 8 0

Aby to zrobić:

$ xinput set-int-prop 6 "Device Enabled" 8 1

To samo dotyczy klawiatury, wystarczy zastąpić numer int-prop odpowiednim identyfikatorem.
Testowany i pracował na cygwin.

Oczywiście musisz wcześniej zaplanować, jak ponownie włączyć urządzenia. np. zaplanuj na cronie, włącz ponownie zdalnie lub wyłącz tylko jeden z nich na pierwszym miejscu.

Philomath
źródło
Żadna inna odpowiedź tutaj nie odpowiada na pytanie.
Philomath
W moim przypadku polecenie wyłączenia myszy wygląda następująco: xinput set-int-prop 9 "Device Enabled" 8 0- tylko, 1) Chciałbym również ukryć wskaźnik myszy, i 2) jeśli przejdę z X na tty (konsola Linux / VT), i następnie z powrotem do X, to jest resetowane ( xinput list-props 9potwierdza to).
Emanuel Berg,
Czy mogę wyłączyć urządzenie „wskaźnika głównego”?
ed22
14

xinput --set-int-propjest przestarzałe. Zamiast tego powinieneś użyć --set-prop. Również xinput --enable [device]i xinput --disable [device]może być używany do włączania i wyłączania urządzenia odpowiednio.

Oto skrypt powłoki, którego używam do włączania, wyłączania i przełączania touchpada mojego laptopa:

#!/bin/bash
# Enables, disables, or toggles device

device='AlpsPS/2 ALPS GlidePoint'
if [[ $1 == -e ]] ; then
    # Enable
    #xinput --set-prop "$device" "Device Enabled" 1
    xinput --enable "$device"
elif [[ $1 == -d ]] ; then
    # Disable
    #xinput --set-prop "$device" "Device Enabled" 0
    xinput --disable "$device"
elif [[ $1 == -t ]] ; then
    # Toggle
    if [[ $(xinput list-props "$device" |
       grep "Device Enabled") == *:*1 ]] ; then
           #xinput --set-prop "$device" "Device Enabled" 0
           xinput --disable "$device"
    else
        #xinput --set-prop "$device" "Device Enabled" 1
        xinput --enable "$device"
    fi
else
    echo "usage: $0 [-edt]"
fi

źródło
Sprawdź mój komentarz do postu Philomatha. Mam ten sam problem xinput --disable 9.
Emanuel Berg,
6

Odpowiedzi na pytanie za pomocą xinput są prawidłowe, ale tutaj jest szybkie, jeśli wszystko, czego szukasz, to prosta blokada typu wygaszacz ekranu. Napisałem to w latach 90. i wszystko, co robi, to zjadanie zdarzeń klawiatury i myszy serwera X, dopóki nie wpiszesz hasła. Żadnych informacji zwrotnych poza opuszczaniem, gdy wpiszesz poprawnie.

http://ishiboo.com/~danny/Projects/xl/

Używam go jako blokady ekranu, dokładnie tak, jak chcesz go używać.

Danny Dulai
źródło
Głosowałem za tym, ponieważ jest to rozwiązanie, którego chcę, ale nie działa ono w systemie Linux z hasłami w tle. Proces musi być rootem, aby uzyskać dostęp do / etc / shadow i powiązanych funkcji, ale chcę uruchomić xl jako użytkownik inny niż root. Mój przypadek użycia: kiedy oglądamy programy na komputerze, moja córeczka lubi uderzać w klawiaturę! xscreensaver nie jest do tego pomocny
Sam Watkins
Twoja odpowiedź jest doskonałym przykładem „beznadziejnego” lub unixowego programowania „zrób jedną rzecz i zrób to dobrze” ... poza tym, że to nie działa dla mnie (z hasłami cienia!) W moim przypadku użycia jestem szczęśliwy, że ciężko -koduj hasło, więc nie ma sprawy. Teraz naucz mnie, jak wyłączyć przycisk zasilania, to ulubiony przycisk mojego dziecka!
Sam Watkins
dlaczego nie chcesz rootować? dlaczego nie suid pliku binarnego XL?
Danny Dulai
BTW, możesz teraz podać hasło w wierszu polecenia lub za pomocą zmiennej środowiskowej.
Danny Dulai
Czy można jeść zdarzenia wejściowe X za pomocą standardowego zestawu narzędzi X i skryptu powłoki?
Alexander Shcheblikin
2

Twoja odpowiedź jest prawdopodobnie najlepsza dla drugiego przypadku użycia (robienie czegoś zdalnie), ale prawdopodobnie nie dla pierwszego (z dala od klawiatury). Jak uruchomisz ponownie xinput, aby przywrócić dostęp po powrocie?

Standardowym rozwiązaniem do blokowania systemu z dala od niego jest XScreenSaver , który jest instalowany domyślnie w większości dystrybucji. Jeśli skonfigurowano blokowanie klawiatury, przed odblokowaniem poprosi o podanie hasła.

cjm
źródło
Zaktualizowałem.
Philomath
2

Przynajmniej w systemach opartych na Debianie, takich jak Ubuntu, istnieje narzędzie o nazwie xtrlock (1)dostępne za pośrednictwem repozytoriów pakietów.

To narzędzie blokuje klawiaturę i mysz, dopóki hasło nie zostanie wprowadzone, pozostawiając widoczne okna. Uważam, że jest to przydatne na komputerach z wyświetlaczami informacyjnymi i tym podobnych.

Jukka Matilainen
źródło
To wydaje się być najprostszą i najlżejszą opcją, i jest dostępna już od połowy lat 90. Jednym z problemów jest to, że nie sądzę, aby można było ukryć zablokowany obraz kursora, co niestety nie nadaje się do oznakowania.
aexl
1

W zależności od sprzętu można usunąć moduły, kontrolując sprzęt. Mam taki skrypt touchpadtoggle, aby włączyć i wyłączyć touchpad.

lsmod | grep -q psmouse && rmmod psmouse || modprobe psmouse

Ale klawiatura wydaje się nie mieć żadnego modułu, a moduł psmouse będzie działał tylko okazjonalnie.

nieznany użytkownik
źródło
1

Jeśli używasz środowiska pulpitu lub menedżera logowania, (GNOME, KDE, XFCE, LXDE) prawie wszystkie z nich mają funkcję blokady ekranu, w której musisz wpisać hasło, aby wrócić do programów.

Ponieważ jednak jest to naprawdę proste, wydaje mi się, że twój problem jest bardziej złożony / inny.

postrzeleniec
źródło
Zaktualizowałem.
Philomath
1

Napisałem to (w .zshrc, ale też powinno działać .bashrc), aby to zrobić, korzystając z powyższych odpowiedzi. Aby zrobić to samo z klawiaturą, zmień parametr w grep Mouse.

setmouse () {
 xinput \
  $1 \
  `xinput | grep Mouse | tr -d " " | tr "\t" " " | cut -d" " -f2 | cut -d"=" -f2`
}
offmouse () { setmouse disable }
onmouse  () { setmouse enable  }
Emanuel Berg
źródło
Sprawdź moją odpowiedź na podobne pytanie dotyczące SO - robi to samo, ale można je wywołać z tty, a także (przy użyciu obejścia) ukrywa wskaźnik.
Emanuel Berg