Ini adalah fd ke sisi master terminal pseudo di emulator terminal yang ingin Anda pantau jika Anda ingin melihat apa yang ditampilkan di dalamnya. Itu tuan fd yang mensimulasikan kawat yang masuk ke terminal nyata. Yang xterm
tertulis di dalamnya adalah karakter yang dihasilkan dari tombol yang Anda tekan. Apa yang dibaca dari itu adalah apa yang ditampilkannya.
Misalnya, di Linux:
$ lsof -ac xterm /dev/ptmx
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
xterm 15173 chazelas 4u CHR 5,2 0t0 2131 /dev/ptmx
Dan kemudian jalankan misalnya:
stty -echo -opost
strace -e read -e read=4 -p15173 2>&1 | stdbuf -o0 sh -c '
grep "^ |" | cut -b11-60 | tr -d " " | xxd -r -p'
Tentu saja, ini bekerja lebih baik jika Anda menjalankannya di terminal dengan tipe dan ukuran yang sama dengan yang Anda coba pantau. Anda bisa mendapatkan ukuran dengan:
stty size < /dev/pts/that-terminal
Bahwa kesedihan apa yang dibaca oleh xterm
dari sisi master terminal, sehingga apa yang ditampilkan di sana, termasuk lokal echo
dari apa yang sedang diketik.
Di -e read=4
atas adalah untuk strace
menampilkan hexdump dari apa yang xterm
dibaca pada fd 4. Sisa dari perintah ini adalah untuk mengkonversi itu ke karakter yang sebenarnya. Saya mencoba peekfd -n -8 15173 4
tetapi untuk beberapa alasan yang hanya memberikan apa yang sedang ditulis.
Kami menggunakan -opost
untuk menonaktifkan post-processing di terminal pemantauan kami, sehingga semuanya xxd
menulis ke sisi pendukung membuatnya tidak berubah ke sisi master kami, sehingga pemantauan kami xterm
mendapatkan hal yang sama dengan yang dipantau. -echo
sedemikian sehingga jika aplikasi di terminal yang dipantau mengirimkan urutan pelarian yang meminta jawaban dari terminal (seperti yang meminta posisi kursor atau jenis terminal atau judul jendela), itu akan membuat jalannya ke pemantauan xterm
dan xterm
kehendak kita. balas juga. Kami tidak ingin gema lokal itu.
Anda juga dapat memantau apa yang sedang diketik dengan melacak write
panggilan sistem ke fd yang sama (ganti read
dengan yang di write
atas). Perhatikan bahwa setelah ditekan Enter, emulator terminal mengirimkan karakter CR, bukan LF. Juga, karena kita menelusuri di sisi master, jika tipe pengguna a<Backspace>b
, kita akan melihat semua 3 penekanan tombol bahkan jika perangkat terminal dalam mode kanonik.
Mengapa milik Anda tidak berfungsi:
tee /dev/pts/user_pts </dev/pts/user_pts
Membaca dari perangkat terminal adalah membaca input pengguna, dan menulis untuk itu untuk menampilkannya kepada pengguna.
Anda menyuruh tee
membaca dari perangkat terminal. Jadi yang terbaca (input pengguna) tidak akan read
oleh aplikasi yang berjalan di terminal (dan sebaliknya, tee
dan itu application
akan memperjuangkan input terminal). Menulis ke perangkat terminal, adalah untuk tampilan di sana, bukan untuk meletakkannya kembali di sana sebagai input. Saat kamu melakukan
echo test
(dengan echo
stdout menjadi terminal), itu bukan hal yang sama seperti jika Anda mengetik test
.
Ada ioctl
( TIOCSTI
) untuk menempatkan karakter kembali sebagai input, tetapi bahkan itu tidak akan berhasil karena Anda bisa mengembalikannya setelah aplikasi seperti yang sudah dibaca lagi, sehingga akan mengubah urutan aplikasi membaca input, dan dengan cara apa pun, itu berarti Anda akan membacanya berulang kali.
ttysnoop
atau mungkinpeekfd
.