Yanıtlar:
İ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
1234
boruya 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 open
ardından dup
boruyu 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.)
Bir boruyu izlemek için yararlı bazı araçlar:
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.