süreçler arası boru trafiğini izleme


13

İsimsiz bir kanal üzerinden iletişim kuran iki Linux sürecim var. Borudaki trafiği nasıl izleyebilirim? Boruya nasıl veri enjekte edebilirim? Kök erişimine sahibim ve boru inode'unu biliyorum.

Yanıtlar:


7

İsimsiz bir boru, doğası gereği dosya tanımlayıcısına sahip uygulamalara özeldir. Borudaki trafiği gözlemlemenin veya değiştirmenin ilkeli bir yolu yoktur. Boruya doğrudan Linux'ta bakmanın bir yolu olduğunu sanmıyorum.

Yine de peşinden gittiklerini yapmanın prensipsiz bir yolu var: ptrace sistem çağrısı yoluyla . Boruyu kendiniz yapmazsınız, ama süreçlerden birine takarsınız. Gözlem için şerit kullanın , örn.

strace -p1234 -s99999 -e write

1234boruya yazan bir işlemin işlem kimliği nerede . Verilerin değiştirilmesi daha zordur, ancak yapılabilir. Bence en kolay yol, ilk önce standart girdisini standart çıktısına ve ayrıca enjekte etmek istediğiniz veriye (ve bastırmak istediğiniz herhangi bir veriyi) kopyalayan bir ara işlem kurmak olacaktır. İki adlandırılmış boru oluşturun ve bu ara işleme bir boru üzerinde stdin ve diğer tarafta stdout ile başlayın. Ardından , her iki hedef işlemin uygun adlandırılmış kanalda yürütülmesini sağlamak için bir hata ayıklayıcı (örn. GDB ) kullanın ve openardından dupboruyu uygun dosya tanımlayıcıya yerleştirin. İşlemdeki işlemlerden birini çökertme şansınız olduğunu unutmayın.

(Son paragrafı anlamadıysanız özür dilerim, ancak belirli bir teknik düzey gerektiriyor. Daha kolay bir yol olduğunu düşünmüyorum.)


Teşekkürler, anlıyorum. Aslında denediğim şey / proc / $ PID / fd'ye gidiyor, burada işlemlerden birinin adlandırılmamış boruları için dosya girişlerini buldum ve kabukta basit kedi ve yankı kullanarak veri okumayı ve verileri başardım, ama davranış biraz tutarsız. Daha fazla araştırmam gerekiyor.
jackhab

1
@jackhab: Oh, borular için işe yaramadığını düşündüm. Ancak öğrendiğiniz gibi, trafiği izlemek için size bu kadar yardımcı olmaz, çünkü üreticiden gelen her bayt tam olarak bir tüketiciye gidecek ve monitörünüzün veya gerçek tüketicinin bunu alıp almayacağını kontrol edemezsiniz. O zaman bu şekilde veri enjekte edebilmelisiniz.
Gilles 'SO- kötü olmayı kes'

2

Bir boruyu izlemek için yararlı bazı araçlar:

Boru Görüntüleyici
tee

Boru tesisatını kontrol etmeyen zaten çalışan bir program için gdb yöntemine bakın:
Çıktıyı Çalışan İşlemden Yeniden Yönlendirme .

Veya strace kullanılabilir :

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

yalnızca tanımlayıcı 1 çağrılarını gösterir. "2> & 1", strader varsayılan olarak stderr'a yazdığı için stderr'ı stdout'a yönlendirmektir.


1
Demek istediğim, halihazırda çalışan işlemin borusuna teleklemektir. A Süreci B sürecini başlatır ve bununla bir kanal aracılığıyla konuşur, bu yüzden tee veya pv gibi proxy yardımcı programlarını kullanmam mümkün olmaz.
jackhab

Birkaç yöntem daha eklendi.
harrymc

Grep kullanmak yerine, çıktıyı fd 1'e yazılan verilerle sınırlamak için "-e write = 1" belirtebilirsiniz.
William Pursell
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.