GNU/Linux >> Znalost Linux >  >> Linux

Jak mohu číst vstup z klávesnice hostitelů při připojení přes SSH?

Tento hacknutý skript mi ​​zatím funguje:

import string

from evdev import InputDevice
from select import select

keys = "X^1234567890XXXXqwertzuiopXXXXasdfghjklXXXXXyxcvbnmXXXXXXXXXXXXXXXXXXXXXXX"
dev = InputDevice('/dev/input/by-id/usb-HID_OMNIKEY_5127_CK_01010053423438303000835748112531-event-kbd')

while True:
   r,w,x = select([dev], [], [])
   for event in dev.read():
        if event.type==1 and event.value==1:
                print( keys[ event.code ] )

Ke čtení z /dev/input/foo používá python-evdev a velmi špinavě je převádí na čitelné hodnoty.

To je to, co dostanu, když spustím skript a připojím kartu ke čtečce:

[email protected] ~ $ python test.py
7
6
4
3
f
a
4
6

Zde je jednoduchý hack, aby to fungovalo snadno až do příštího spuštění, za předpokladu, že máte požadovaná oprávnění.

Pomocí následujícího příkazu zobrazíte všechny procesy běžící na počítači

ps -ef

Abychom našli PID procesu přihlášení/getty, odkud je klávesnice aktuálně načítána, můžeme výsledky této funkce předat přes grep.

ps -ef | grep tty

Mohli byste vidět něco jako

root     23698     1  0 18:17 ttyO0    00:00:00 /sbin/getty -L ttyO0 115200 vt102

Poznamenejte si číslo ve druhém sloupci – to je PID. A šestý sloupec, kde je klávesnice.

Chcete-li tento proces zastavit, použijte následující příkaz (nahrazením čísla za jakékoli vaše PID)

kill -stop 23698

Nyní můžete číst tty, odkud přicházejí klávesy klávesnice (tty je zobrazeno v příkazu ps)

cat /dev/ttyO0

cat bude číst navždy a bude vydávat vše, co je zadáno na klávesnici, dokud ho nezabijete.

Až budete hotovi a budete se chtít vrátit k normálnímu chování, můžete obnovit funkci klávesnice pomocí

kill -cont 23698

To samozřejmě nastiňuje obecnou myšlenku. Ke čtení z tty můžete použít svůj vlastní program.


Musel jsem to udělat nedávno kvůli Hackathonu, tak jsem si řekl, že přispěji tím, co jsme nakonec udělali.

  1. Nastavte autologin jako root na tty1 (hlavní terminál, kde klávesnice ukládá svůj vstup). Záznam wiki Arch Linux má dobré pokyny. Restartujte jej, abyste se mohli přihlásit.

  2. Zkopírujte zdroj malého programu známého jako 'ttyEcho'. Jednu kopii lze nalézt zde, ale vyhledávání na Google přináší mnohem více. Tento program vám umožňuje odesílat příkazy do jiného terminálu. Kompilace na cílovém počítači.

  3. Nyní, když můžeme spouštět cokoliv na /dev/tty1, stačí ./ttyEcho -n /dev/tty1 'cat > buffer' pro získání všeho vstupu na tty1, který má být přidán do souboru. Místo vytváření stále se rozšiřujícího souboru použijte mkfifo buffer nejprve vygenerujte speciální soubor, který je pouze pojmenovanou rourkou - frontou FIFO, která je zálohována pouze pamětí.

  4. Z vaší relace SSH můžete nyní pouze tail -f filename pro sledování všech vstupů z klávesnice na tty1. V rámci pythonu, open('filename','r') a pokračujte ve volání .read() nebo .readline() na něj, abyste získali přísun dat z klávesnice, jakmile přicházejí.

Tato metoda byla pro nás skvělá, protože se vyhýbá analýze skenovacího kódu klávesnice a uchovává pěkně velkou vyrovnávací paměť dat bez jakéhokoli kódu.


Linux
  1. Jak mohu zjistit aktuální využití CPU z shellu?

  2. Jak vypočítat využití CPU procesu pomocí PID v Linuxu z C?

  3. Jak mohu získat stav klávesnice v Linuxu?

  1. Jak se dostanu ke čtení ze standardního vstupu?

  2. Jak mohu získat informace o kontejneru Docker Linux ze samotného kontejneru?

  3. Jak se mohu vyhnout ověření hostitele SSH pro známé hostitele?

  1. Jak mohu zkopírovat výstup ze vzdáleného příkazu do místní schránky?

  2. Jak mohu změnit rozložení vstupní klávesnice v konzole?

  3. Jak mohu rezervovat blok paměti z jádra Linuxu?