memantau lalu lintas pipa antarproses

13

Saya memiliki dua proses Linux yang berkomunikasi melalui pipa tanpa nama. Bagaimana bisa memonitor lalu lintas di pipa? Bagaimana saya bisa menyuntikkan data ke dalam pipa? Saya memiliki akses root dan tahu inode pipa.

jackhab
sumber

Jawaban:

7

Pipa tanpa nama pada dasarnya bersifat pribadi untuk aplikasi yang memiliki deskriptor file. Tidak ada cara berprinsip untuk mengamati atau memodifikasi lalu lintas di pipa. Saya juga tidak berpikir ada cara untuk melihat pipa secara langsung di Linux.

Ada cara yang tidak berprinsip untuk melakukan kurang lebih apa yang Anda kejar: melalui panggilan sistem ptrace . Anda tidak akan menempel ke pipa per se, tetapi ke salah satu proses. Untuk pengamatan, gunakan strace , mis

strace -p1234 -s99999 -e write

di mana 1234ID proses dari proses yang menulis di pipa. Memodifikasi data lebih sulit, tetapi bisa dilakukan. Saya pikir cara termudah adalah dengan terlebih dahulu mengatur proses perantara yang menyalin input standarnya ke output standar, ditambah data yang ingin Anda masukkan (dan minus semua data yang ingin Anda tekan). Buat dua pipa bernama dan mulai proses menengah dengan stdin di satu pipa dan stdout di yang lain. Kemudian gunakan debugger (misalnya GDB ) untuk membuat kedua proses target dieksekusi openpada pipa bernama yang sesuai, kemudian dupuntuk menempatkan pipa pada deskriptor file yang sesuai. Perhatikan bahwa ada kemungkinan Anda akan menabrak salah satu proses dalam proses.

(Jika Anda tidak mengerti paragraf terakhir, saya minta maaf, tetapi memang membutuhkan tingkat teknis tertentu. Saya tidak berpikir ada cara yang lebih mudah.)

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Terima kasih, saya mengerti. Apa yang sebenarnya saya coba akan ke / proc / $ PID / fd, di mana saya menemukan entri file untuk pipa yang tidak disebutkan namanya dari salah satu proses dan saya berhasil membaca dan data menggunakan cat dan gema sederhana dalam shell, tetapi perilaku agak tidak konsisten. Saya perlu menyelidiki lebih lanjut.
jackhab
1
@jackhab: Oh, saya pikir itu tidak berhasil untuk pipa. Tetapi ketika Anda tahu itu tidak akan banyak membantu Anda untuk memantau lalu lintas, karena setiap byte dari produsen akan tepat untuk satu konsumen dan Anda tidak dapat mengontrol apakah monitor Anda atau konsumen yang sebenarnya akan mendapatkannya. Anda harus bisa menyuntikkan data seperti itu.
Gilles 'SO- stop being evil'
2

Beberapa alat yang berguna untuk memonitor pipa:

Tee Penampil Pipa

Untuk program yang sudah berjalan di mana orang tidak mengontrol pipa, lihat metode gdb:
Mengarahkan Output dari Proses Menjalankan .

Atau seseorang dapat menggunakan strace :

strace -ewrite -p $PID 2>&1 | grep "write(1"

hanya menampilkan panggilan deskriptor 1. "2> & 1" adalah untuk mengarahkan ulang stderr ke stdout, seperti strace yang menulis ke stderr secara default.

harrymc
sumber
1
Yang saya maksud adalah penyadapan ke pipa proses yang sudah berjalan. Proses A meluncurkan proses B dan berbicara dengannya melalui pipa jadi saya tidak punya cara untuk menggunakan utilitas proxy seperti tee atau pv.
jackhab
Menambahkan beberapa metode lagi.
harrymc
Daripada menggunakan grep, Anda dapat menentukan "-e tulis = 1" untuk membatasi output ke data yang ditulis ke fd 1.
William Pursell