GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana saya bisa membaca input dari keyboard host saat terhubung melalui SSH?

Skrip yang diretas bersama ini berfungsi untuk saya untuk saat ini:

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 ] )

Ia menggunakan python-evdev untuk membaca dari /dev/input/foo dan dengan sangat kotor mengonversinya menjadi nilai yang dapat dibaca.

Inilah yang saya dapatkan saat menjalankan skrip dan menghubungkan kartu ke pembaca:

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

Ini adalah retasan sederhana untuk membuatnya bekerja dengan mudah hingga boot berikutnya, dengan asumsi Anda memiliki hak istimewa yang diperlukan.

Menggunakan perintah berikut menunjukkan semua proses yang berjalan di komputer

ps -ef

Untuk menemukan PID proses masuk/getty dari tempat keyboard saat ini dibaca, kita dapat meneruskan hasil fungsi ini melalui grep.

ps -ef | grep tty

Anda dapat melihat sesuatu seperti

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

Catat nomor di kolom kedua - itu adalah PID. Dan kolom keenam, tempat keyboard berada.

Untuk menghentikan proses tersebut, gunakan perintah berikut (ganti nomor untuk apa pun PID Anda)

kill -stop 23698

Sekarang, Anda dapat membaca tty dari mana tombol keyboard berasal (tty ditampilkan di perintah ps)

cat /dev/ttyO0

cat akan membaca selamanya, mengeluarkan apa pun yang dimasukkan pada keyboard, sampai Anda mematikannya.

Setelah selesai, dan ingin kembali ke perilaku normal, Anda dapat melanjutkan fungsi keyboard dengan

kill -cont 23698

Tentu saja itu menguraikan gagasan umum. Anda dapat menggunakan program Anda sendiri untuk membaca dari tty.


Harus melakukan ini baru-baru ini untuk Hackathon, jadi saya pikir saya akan berkontribusi apa yang akhirnya kami lakukan.

  1. Siapkan autologin sebagai root di tty1 (terminal utama tempat perangkat keyboard membuang inputnya). Entri wiki Arch Linux memiliki instruksi yang baik. Nyalakan ulang untuk membuatnya masuk.

  2. Salin sumber program kecil yang dikenal sebagai 'ttyEcho'. Satu salinan dapat ditemukan di sini, tetapi pencarian Google menampilkan lebih banyak lagi. Program ini memungkinkan Anda untuk menggemakan perintah ke terminal lain. Kompilasi pada mesin target.

  3. Sekarang kita bisa menjalankan apapun di /dev/tty1, kita hanya bisa ./ttyEcho -n /dev/tty1 'cat > buffer' untuk mendapatkan semua input pada tty1 untuk ditambahkan ke file. Alih-alih membuat file yang terus berkembang, gunakan mkfifo buffer pertama untuk menghasilkan file khusus yang hanya berupa pipa bernama - antrean FIFO yang hanya didukung oleh memori.

  4. Dari sesi SSH, Anda sekarang hanya dapat tail -f filename untuk menonton semua input keyboard di tty1. Dari dalam python, open('filename','r') dan terus panggil .read() atau .readline() di atasnya untuk mendapatkan umpan data keyboard saat masuk.

Metode ini bagus untuk kami karena menghindari penguraian kode pindaian keyboard, dan menyimpan buffer besar data yang bagus tanpa kode apa pun.


Linux
  1. Bagaimana saya bisa menentukan pemanfaatan CPU saat ini dari shell?

  2. Bagaimana cara menghitung penggunaan CPU dari suatu proses oleh PID di Linux dari C?

  3. Bagaimana saya bisa mendapatkan status keyboard di Linux?

  1. Bagaimana saya bisa mengeksekusi kode PHP dari baris perintah?

  2. Bagaimana saya bisa mendapatkan informasi wadah Docker Linux dari dalam wadah itu sendiri?

  3. Bagaimana saya bisa menghindari verifikasi host SSH untuk host yang dikenal?

  1. Bagaimana saya bisa menyalin output dari perintah jarak jauh ke clipboard lokal?

  2. Bagaimana saya bisa mengubah tata letak keyboard input saat berada di konsol?

  3. Bagaimana saya bisa memesan satu blok memori dari kernel Linux?