ตรวจสอบทราฟฟิกไพพ์ของ interprocess


13

ฉันมีสองกระบวนการลินุกซ์สื่อสารผ่านท่อนิรนาม จะตรวจสอบปริมาณการจราจรในท่อได้อย่างไร ฉันจะฉีดข้อมูลลงในท่อได้อย่างไร ฉันมีสิทธิ์เข้าถึงรูทและรู้ว่าไอโหนดไอ

คำตอบ:


7

ไปป์นิรนามโดยธรรมชาติส่วนตัวกับโปรแกรมประยุกต์ที่มีตัวอธิบายไฟล์ ไม่มีหลักการที่จะสังเกตหรือแก้ไขทราฟฟิกบนไพพ์ ฉันไม่คิดว่าจะมีวิธีการดูไพพ์โดยตรงบน Linux เช่นกัน

มีวิธีที่ไม่น่าเชื่อว่าจะทำสิ่งที่คุณทำอยู่ไม่มากก็น้อย: ผ่านการเรียกของระบบptrace คุณจะไม่ถูกตรึงบนท่อต่อ se แต่ไปยังหนึ่งในกระบวนการ สำหรับการสังเกตใช้straceเช่น

strace -p1234 -s99999 -e write

โดยที่1234เป็น ID กระบวนการของกระบวนการที่เขียนบนไพพ์ การแก้ไขข้อมูลนั้นยากขึ้น แต่สามารถทำได้ ฉันคิดว่าวิธีที่ง่ายที่สุดคือการตั้งค่ากระบวนการกลางที่คัดลอกอินพุตมาตรฐานไปยังเอาต์พุตมาตรฐานก่อนรวมถึงข้อมูลที่คุณต้องการแทรก (และลบข้อมูลใด ๆ ที่คุณต้องการระงับ) สร้างไปป์ที่มีชื่อสองรายการและเริ่มต้นกระบวนการขั้นกลางที่มี stdin ในหนึ่งไปป์และ stdout ที่อื่น ๆ จากนั้นใช้ดีบักเกอร์ (เช่นGDB ) เพื่อทำให้กระบวนการเป้าหมายทั้งคู่ดำเนินการopenบนไพพ์ที่มีชื่อที่เหมาะสมจากนั้นจึงdupวางไพพ์ไปที่ไฟล์ descriptor ที่เหมาะสม โปรดทราบว่ามีโอกาสที่คุณจะเกิดความขัดข้องหนึ่งในกระบวนการในกระบวนการ

(ถ้าคุณไม่เข้าใจย่อหน้าสุดท้ายฉันขอโทษ แต่มันต้องมีระดับของเทคโนโลยีฉันไม่คิดว่าจะมีวิธีที่ง่ายกว่า)


ขอบคุณฉันเข้าใจ สิ่งที่ฉันพยายามจริง ๆ คือจะ / proc / $ PID / fd ซึ่งฉันพบรายการไฟล์สำหรับไพพ์ที่ไม่มีชื่อของกระบวนการใดกระบวนการหนึ่งและฉันจัดการอ่านและข้อมูลโดยใช้ cat และ echo ง่ายๆในเชลล์ แต่พฤติกรรมค่อนข้าง ไม่แน่นอน ฉันต้องตรวจสอบเพิ่มเติม
jackhab

1
@jackhab: โอ้ฉันคิดว่ามันใช้ไม่ได้กับท่อ แต่อย่างที่คุณทราบมันไม่ได้ช่วยอะไรมากสำหรับการตรวจสอบปริมาณการใช้งานเนื่องจากแต่ละไบต์จากผู้ผลิตจะไปถึงผู้บริโภคหนึ่งรายและคุณไม่สามารถควบคุมได้ว่าจอภาพของคุณหรือผู้บริโภคจริงจะได้รับมาหรือไม่ คุณควรจะสามารถฉีดข้อมูลได้อย่างนั้น
Gilles 'SO- หยุดความชั่วร้าย'

2

เครื่องมือบางอย่างมีประโยชน์สำหรับการตรวจสอบท่อ:

ไปป์ทีViewer

สำหรับโปรแกรมแล้วทำงานที่หนึ่งไม่ได้ควบคุมท่อให้ดูวิธีการ gdb นี้เปลี่ยนเส้นทางออกจากกระบวนการทำงาน

หรือสามารถใช้strace :

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

แสดงการโทร descriptor 1 รายการเท่านั้น "2> & 1" คือเปลี่ยนเส้นทาง stderr ไปยัง stdout เนื่องจาก strace เขียนไปยัง stderr โดยค่าเริ่มต้น


1
สิ่งที่ฉันหมายถึงคือการดักฟังโทรศัพท์ไปยังไพพ์ของกระบวนการที่กำลังทำงานอยู่ โปรเซส A เปิดตัวโปรเซส B และพูดคุยกับมันผ่านไพพ์ดังนั้นฉันจึงไม่มีวิธีใช้พร็อกซียูทิลิตี้อย่าง tee หรือ pv
jackhab

เพิ่มวิธีการเพิ่มเติม
harrymc

แทนที่จะใช้ grep คุณสามารถระบุ "-e write = 1" เพื่อ จำกัด เอาต์พุตไปยังข้อมูลที่เขียนถึง fd 1
William Pursell
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.