Xneur-แแก แแฎแแ แแแญแแ แแก แแแกแ แฃแแแแแ แแแ แแแแฃแแ แขแแแฏแแ แแแแแแฌแแแ แแแแ แแฅแแกแ แแแแก แแแแแแแแแแแจแ. (แฉแแแก แแแกแแขแแแแ OpenSUSE 15.1-แแก แแแแแกแแแแก แจแแแแแ: Xneur แฉแแ แแฃแแแ, แคแแแฏแ แแแ แแแ แแแแแ แคแแแฃแกแก แแ แแ แแแ แแแแแแแแแแแจแ แชแแแชแแแแแแ แแฎแแแ แฃแแแ แแแแแแแขแฃแ แแก แจแแงแแแแแ).
"แแฐ, แฏแแแแแแ, แแกแแ แแแแแฌแงแ แแ แแกแฌแแ แ แแแแแแแแแแ แแแ แแคแ" - แฉแแแก แแแแฃแจแแแแ แจแ แแก แฃแฎแแแกแ แฎแจแแ แแ แฎแแแแ. แแ แแก แแ แแแขแแแก แ แแแแ แแแแแขแแฃแ แก.
แแแแแแ แแฃแแแ, แแ (แ แแแแ แช แแแแแแแแ แแแแแแแ แก) แจแแแแซแแแ แกแแแแแแ แแแแคแแแ แฉแแแแแแงแแแแแ แแก, แ แแช แแแแแ. แแแแ แแ แแ แแแแแแแ (แฏแแ Punto Switcher-แแแ, แจแแแแแ แแ Windows Vista-แก แฌแงแแแแแแ, แแแแแก Linux-แแ แแแแแกแแแ, xneur-แแแ) แแฃแกแขแแ แแ แแ แ แแ. แแแแชแแแแแแ แ, แ แแ แแแ แแแแ แแแแแแ แแ แแกแฌแแ แ แแแแแแแแแฃแแแ (แแก แฉแแแฃแแแแ แแ แฎแแแแ แแฎแแแ แกแแขแงแแแก แแแ แแคแแก แแแแแก), แแแแฌแแฅแแ โแแแฃแแ/แจแแกแแแแแแโ. แแ แแแแฆแแ แแก, แ แแช แแแแแญแแแ.
แแ แแ แแแกแแแแก แแ แแแฃแฅแขแก แแฅแแก แแแขแแแแแฃแ แ (แฉแแแ แแแแแแกแแฎแแแแแแ) แคแฃแแฅแชแแแแแแฃแ แแแ/แกแแ แแฃแแแก แแแแแคแแ แแแแ. แแแแแแ แแแแก แแ แแ.
TL.DR
แแแแแแแแแแแ แแฅแแแแ แงแแแแ แกแแฎแแก แขแแฅแแแแฃแ แ แแแขแแแ, แแกแ แ แแ แฏแแ -
แแแแแแแ แจแแแแแแ แฅแชแแแ แแงแแ แ แแแแแ แแแฃแแแ:
- โแแแฃแแ/แจแแกแแแแแแโ: แแแ แฃแแแแก แแแแ แกแแขแงแแแก, แชแแแแก แแแแแแแแแแก แแฅแขแแฃแ แคแแแฏแแ แแจแ (0-แแแ 1-แก แจแแ แแก) แแ แแกแแ แแแ แแคแแแก.
- โแแแ แชแฎแแแ Ctrl แแ แแคแ แแก แแแ แแจแโ: แชแแแแก แแแแแแแแแแก แแฅแขแแฃแ แคแแแฏแแ แแจแ (0-แแแ 1-แก แจแแ แแก).
- โแแแ แชแฎแแแ Shift แแ แแคแ แแก แแแ แแจแโ: แฉแแ แแแแก แแแแแแแแแแก No. 0 แแฅแขแแฃแ แคแแแฏแแ แแจแ.
- โแแแ แฏแแแแ Shift แแ แแคแ แแก แแแ แแจแโ: แฉแแ แแแแก แแแแแแแแแแก No1 แแฅแขแแฃแ แคแแแฏแแ แแจแ.
แแแแแ แแแแ แแแแแแแ แฅแชแแแแก แแแ แแแแแก. แแแแแฎแแแฃแ แแแแก แแแ แแจแ, แแก แแ แแ แแก แกแแแแขแแ แแกแ (แแ แแแแแช แแแ แแแ แแแ ). แแ แแฏแแ แ, แ แแ แฐแแแ แแแ แแฅแแแแ แแกแแแแกแ แแ แแแแแแแแแก แแฅแแแ แแฃแแแขแแ แแแก แกแแแแแ แแกแ แแ แแชแแแขแ.
NB แแแแขแแ แ แแ แแแแแแแแ แ แแแ แกแแแจแ, keylogger แแแแแแ แแแฃแแแ "/dev/input/", xswitcher แฃแแแ แแงแแก แแแจแแแแฃแแ root แฃแคแแแแแแแ:
chown root:root xswitcher
chmod +xs xswitcher
แแแฎแแแ แแแแแแแแแกแฌแแแแ: แคแแแแแก แแคแแแแแแ suid แฃแแแ แแงแแก root, แ แแแแแ แแแแช แแ แแก แแคแแแแแแ, แแแจแแแแแกแแแแแแ แแแแแแฅแชแแแ แกแฃแแแแ.
แแแ แแแแแแแแก (แแ แแ แแแ แแแแแแแแแแกแ) แจแแฃแซแแแแ แแแแแแ แแแ
go get "github.com/micmonay/keybd_event"
go get "github.com/gvalkov/golang-evdev"
### X11 headers for OpenSUSE/deb-based
zypper install libX11-devel libXmu-devel
apt-get install libx11-dev libxmu-dev
cd "x switcher/src/"
go build -o xswitcher -ldflags "-s -w" --tags static_all src/*.go
แแแแแแขแแ แแแขแแแแขแฃแ แ แแแฌแงแแแ แแแแแแแแแแ (แแแแแแแแแแฃแแแ DE-แแ).
แแฃแจแแแแก, โแคแแคแแก แแ แแแฎแแแกโ (โ30 แฌแแแ CPU แแฆแแจแ, โ12 MB RSS-แจแ).
แแแขแแแแแ
แแฎแแ - แแแขแแแแแ.
แแแแแ แกแแชแแแ แแแแแแแแ แแแแแ แฉแแแก แจแแแแฃแ แชแฎแแแแแแ แแ แแแฅแขแก แแแแแแ แแ แแ แซแแแแแ แแแแแ แแแ แแแแแ แแ แแแก แแแฌแงแแแ. แแกแ แ แแ, แงแแแแแคแแ แ แแ แแแแแแ (แแฎแแแแ แกแแฅแแฆแแแแแแแจแ) แแ แแแคแแ แฃแแแ AGPL-แแ (โแกแแแแ แแกแแแ แ แแแขแแแขแโ).
xswitcher แแแแ แแฌแแ แแแ golang-แจแ, C-แแก แแแแแแแแฃแ แ แฉแแแแ แแแแแ. แแแ แแฃแแแแแ, แ แแ แแก แแแแแแแ แแแแแแฌแแแแก แงแแแแแแ แแชแแ แ แซแแแแกแฎแแแแแก (แฏแแ แฏแแ แแแแ). Cgo-แก แแแแแงแแแแแแ แแแแแแจแแ แแแแก แฃแแแ แแก แจแแแแ แฉแฃแแแแแกแแก, แ แแช แแแแแ.
แขแแฅแกแขแจแ แแแชแแแฃแแแ แแแแแแขแแ แแแ แแแแก แจแแกแแฎแแ, แแฃ แกแแแแแ แแ แแก แแแกแแกแฎแแแ แแ แ แแขแแ. แแแแขแแ แ แแ xneur แแแแ โแแ แจแแแแแแแแโ, แแแแฆแ แแก แกแแฌแงแแก แฌแแ แขแแแแ
"/dev/input/"-แแก แแแแแงแแแแแแก แแฅแแก แ แแแแ แช แแแแแกแ แฃแแแ แแขแแกแแแแแ (แงแแแแแคแแ แ แฉแแแก, แแแขแแแแขแฃแ แ แแแแแแ แแแแก แแแญแแ แแก แฉแแแแแแ) แแ แฃแแ แงแแคแแแ แแฎแแ แแแแ. แฃแแ แงแแคแแแ แแฎแแ แแแแแ:
- แแแขแแแแขแฃแ แ แแแแแแ แแแ (แแแแแแแแแ "2" แแแแแ) แแ แจแแแกแแแแแแแ x-แแแ แแแแแแ แแแแก.
- X11 แแแขแแ แคแแแกแแก แกแแจแฃแแแแแแ แจแแงแแแแ แแ แฉแแแก (แแแแแแแแแ, VNC แแฃแจแแแแก).
- แกแแญแแ แแ root.
แแแแ แแก แแฎแ แแ, แจแแกแแซแแแแแแแ X แแแแแแแแแแก แแแแแฌแแ แ "XSelectExtensionEvent()"-แแ. แจแแแแซแแแแ แแแแแฎแแแแ
"แกแแแแ แแกแแแ แ" แแแแแแแแแแ แแแแแแแแฃแแแ แแแ แขแฃแแแฃแ แ แแแแแแแขแฃแ แแก แฎแ แแฎแแแ. แแแแแแแ keybd_event-แแก แแแขแแ แก, แแแแ แแ แแแกแขแ แแฅแชแแ แแฅ แซแแแแแ แแแฆแแแ แแแแแกแแ แแ แจแแแแแแแ แแแแแแแแแแ แแแฃแฌแแแก. แแแแแแแแแ, แแ แแแงแแแแ แแแ แฏแแแแ Win แแแแแแจแก แแ-3 แ แแแแก แจแแกแแ แฉแแแแ. แแ แแฎแแแแ แแแ แชแฎแแแ Win แแแแแแชแแแ แฃแแแ.
แชแแแแแแ แแแแแแ
- แฉแแแ แแ แแคแแ แ แแแชแแ "แแแแแแแแขแฃแ แ" แจแแงแแแแแก แจแแกแแฎแแ (แแแแแแแแ: ยฝ). แแก แแฎแแ แแ แแ แแก แกแแญแแ แ.
- แฉแแแ แแ แแกแฌแแ แแ แแแแแแจแแแ แกแฌแแ แแแแแแแก. แฉแแแก แจแแแแฎแแแแแจแ, แแก แแ แฆแแแแก แแฅแชแแแขแก.
- แแ แแ แแก แแแแคแแ แจแแงแแแแแก แแแแแแแ. แแแแก แแแชแแแแ, แแ แกแแแแแก แ แแแแแแแแ แคแฃแแฅแชแแ: Compare(), CtrlSequence(), RepeatSequence(), SpaceSequence(). แแแแแแแ
nsmcan แแฅแแแแ แแแแแแกแแแแก: แจแแกแฌแแ แแแฃแแแ แแแแจแ แแ แแฅ. แแแ แแแแฃแแ แแแแแแแแแ, แแฅแแแ แจแแแแซแแแแ แแแแญแแ แแ แจแแชแแแแแแ แแแแแชแแแแกแแก.
แแ แแขแแแแ แแ แแแชแ "แ แแแแ " แแ แแแแแกแแแแแแ แแแแแกแแแแ แจแแแแแแแแแแแแก. - (แฒ แฆแแแ แแ) แแ แฎแแแแก แแแแแฃแ แแแขแฃแแ แแแแแงแแแแแ (keyboardEvents, miceEvents).
แแแกแแแแ
แแแแแฅแกแ แฃแแแ แขแแแแกแ แแ แแชแแแฃแ แฃแแแ. แแ แฉแแแแแแ แ แกแฃแแแแ. แแกแ แ แแ, แแแแก แแแแจแแแแแ แแ แแแแแแ, แ แแ แแแแฅแแแก แแแแแกแแแแ แ แขแแฅแแแแแกแ แจแแซแแแแก แแแแกแ แฃแแแก แแก, แ แแช แแแก แกแฃแ แก. แแ แแแแก แฌแงแแแแแแ, แแก แแ แแแฃแฅแขแ แแ แแแแฆแฃแแแแ แแฎแแ แแแญแแ แแก แแแ แแจแ, แ แแแแ แช แฃแแแขแแกแแแ แฃแแ แแแแ แแแกแแ แแแแแ.
แแแกแฃแ แแแแ แฌแแ แแแขแแแแก!
แฌแงแแ แ: www.habr.com