Jika saya melakukan:
echo foo > /dev/pts/12
Beberapa proses akan membacanya foo\n
dari deskriptor file ke sisi master.
Apakah ada cara untuk mengetahui apa itu proses itu?
Atau dengan kata lain, bagaimana saya bisa mengetahui mana xterm / sshd / script / screen / tmux / expect / socat ... yang ada di ujung lain /dev/pts/12
?
lsof /dev/ptmx
akan memberi tahu saya proses yang memiliki deskriptor file di sisi master dari setiap pty. Sebuah proses itu sendiri dapat menggunakan ptsname()
( TIOCGPTN
ioctl) untuk mencari tahu perangkat slave berdasarkan fd sendiri ke sisi master, jadi saya bisa menggunakan:
gdb --batch --pid "$the_pid" -ex "print ptsname($the_fd)"
untuk masing-masing pid / fd dikembalikan oleh lsof
untuk membangun pemetaan itu, tetapi apakah ada cara yang lebih langsung, dapat diandalkan dan kurang mengganggu untuk mendapatkan informasi itu?
sumber
sudo find /proc/*/fd/0 -ls | grep '/dev/pts/4'
, akan memberikan daftar PID (/proc/PID
) sebagai output./dev/pts/4
. Biasanya, itu akan menjadi nenek moyang yang sama dari proses-proses yang telah/dev/pts/4
terbuka, tetapi tidak harus.screen
, ituscreen
yang mengalokasikan dan secara aktif mengelola budak pty untuk kehidupan perangkat, tetapi - seperti, saya pikir - shell dibuat pemimpin proses untuk tty itu dan, seperti Anda output menunjukkan, Anda dapatkanbash
atau apa pun darips
tidakscreen
. Saya melacak beberapaxterms
kembali kexterm
pid berdasarkan/proc/locks
tetapi itu longgar.Jawaban:
Pada awalnya saya mencoba melacak kembali beberapa
xterm
kexterm
pid berdasarkan info yang saya temukan di/proc/locks
tetapi itu longgar. Maksud saya, itu berhasil, saya pikir, tetapi itu adalah keadaan terbaik - saya tidak sepenuhnya memahami semua informasi yang disediakan oleh file dan hanya mencocokkan apa yang tampaknya sesuai antara kontennya dan proses terminal yang dikenal.Kemudian saya mencoba menonton
lsof/strace
padawrite/talk
proses aktif antara ptys. Saya belum pernah benar-benar menggunakan salah satu program sebelumnya, tetapi mereka tampaknya mengandalkanutmp
. Jika pty saya yang ditargetkan tidak memilikiutmp
entri untuk alasan apa pun mereka berdua menolak untuk mengakui bahwa itu ada. Mungkin ada jalan keluar, tetapi saya cukup bingung untuk meninggalkannya.Saya mencoba beberapa
udevadm
penemuan dengan 136 dan 128 node perangkat nomor utama seperti yang diiklankan untuk masingpts
-ptm
masing/proc/tty/drivers
, tetapi saya juga tidak memiliki pengalaman yang sangat berguna dengan alat itu dan sekali lagi muncul tidak ada yang substansial. Menariknya, saya perhatikan:min
kisaran untuk kedua jenis perangkat ini sangat mengejutkan0-1048575
.Baru setelah saya meninjau kembali kernel kernel ini saya mulai berpikir tentang masalah dalam hal
mount
s. Saya telah membaca itu beberapa kali sebelumnya, tetapi ketika penelitian lanjutan di baris itu membawa saya ke tambalan 2012 ini/dev/pts
saya punya ide:Saya pikir apa yang biasanya saya gunakan untuk mengaitkan proses dengan
mount
? Dan tentu saja:Maka dengan informasi itu saya bisa lakukan, misalnya dari
terminology
:Seperti yang Anda lihat, dengan sedikit pengujian eksplisit, proses semacam itu dapat dilakukan untuk menghasilkan proses master pty yang sewenang-wenang. Mengenai soket, saya cukup yakin orang bisa mendekatinya dari arah itu juga menggunakan
socat
sebagai lawan debugger, tapi saya belum meluruskan bagaimana. Namun, saya curigass
mungkin membantu jika Anda lebih terbiasa dengan saya daripada saya:Jadi saya mengaturnya dengan pengujian yang sedikit lebih eksplisit, sebenarnya:
Ini mencetak
$$
num\0
null byte untuk setiap pty dan memeriksa setiap proses master terhadap cek sebelumnya. Jika perbedaannya$$
maka ia menghubungkan pid dengan pty. Ini kebanyakan berhasil. Maksud saya, bagi saya, ia kembali:Yang benar, tetapi, jelas, itu sedikit bersemangat. Maksud saya, jika salah satu dari mereka membaca dalam banyak data pada saat itu mungkin akan hilang. Saya mencoba mencari cara untuk mengubah
stty
mode pada pty lain untuk mengirim bit berhenti dulu atau sesuatu seperti itu sehingga saya bisa memperbaikinya.sumber
Jika Anda hanya mencari siapa yang memiliki koneksi dan dari mana mereka terhubung, perintah who akan bekerja dengan baik.
Jika Anda juga ingin tahu apa yang sedang mendengarkan pada koneksi itu, w akan menunjukkannya di akhir.
Dan untuk mendapatkan pids, batasi ps hingga sesi tty yang Anda lihat. Sepenuhnya tidak mengganggu untuk boot.
Catatan, ini dapat menyebabkan ikan haring merah, tergantung pada waktu. Tapi ini tempat yang bagus untuk memulai.
sumber
/dev/pts/4
, di mana Anda menjalankanw
perintah itu.Saya memiliki masalah yang sama dengan qemu, dan akhirnya saya menemukan solusi yang sangat buruk (tapi masih solusi): mem-parsing memori proses.
Ini berfungsi di sini karena saya tahu bahwa qemu menyimpan pts jarak jauh dalam sebuah string dengan format tertentu dan dialokasikan pada heap. Mungkin itu dapat bekerja dalam situasi lain juga dengan beberapa perubahan dan dengan menggunakan kembali pid dari output fuser (periksa jawaban lain).
Kode diadaptasi dari sini .
sumber