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 xtermtertulis 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 xtermdari sisi master terminal, sehingga apa yang ditampilkan di sana, termasuk lokal echodari apa yang sedang diketik.
Di -e read=4atas adalah untuk stracemenampilkan hexdump dari apa yang xtermdibaca pada fd 4. Sisa dari perintah ini adalah untuk mengkonversi itu ke karakter yang sebenarnya. Saya mencoba peekfd -n -8 15173 4tetapi untuk beberapa alasan yang hanya memberikan apa yang sedang ditulis.
Kami menggunakan -opostuntuk menonaktifkan post-processing di terminal pemantauan kami, sehingga semuanya xxdmenulis ke sisi pendukung membuatnya tidak berubah ke sisi master kami, sehingga pemantauan kami xtermmendapatkan hal yang sama dengan yang dipantau. -echosedemikian 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 xtermdan xtermkehendak kita. balas juga. Kami tidak ingin gema lokal itu.
Anda juga dapat memantau apa yang sedang diketik dengan melacak writepanggilan sistem ke fd yang sama (ganti readdengan yang di writeatas). 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 teemembaca dari perangkat terminal. Jadi yang terbaca (input pengguna) tidak akan readoleh aplikasi yang berjalan di terminal (dan sebaliknya, teedan itu applicationakan 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 echostdout 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.
ttysnoopatau mungkinpeekfd.