ฉันมีสองกระบวนการลินุกซ์สื่อสารผ่านท่อนิรนาม จะตรวจสอบปริมาณการจราจรในท่อได้อย่างไร ฉันจะฉีดข้อมูลลงในท่อได้อย่างไร ฉันมีสิทธิ์เข้าถึงรูทและรู้ว่าไอโหนดไอ
ฉันมีสองกระบวนการลินุกซ์สื่อสารผ่านท่อนิรนาม จะตรวจสอบปริมาณการจราจรในท่อได้อย่างไร ฉันจะฉีดข้อมูลลงในท่อได้อย่างไร ฉันมีสิทธิ์เข้าถึงรูทและรู้ว่าไอโหนดไอ
คำตอบ:
ไปป์นิรนามโดยธรรมชาติส่วนตัวกับโปรแกรมประยุกต์ที่มีตัวอธิบายไฟล์ ไม่มีหลักการที่จะสังเกตหรือแก้ไขทราฟฟิกบนไพพ์ ฉันไม่คิดว่าจะมีวิธีการดูไพพ์โดยตรงบน Linux เช่นกัน
มีวิธีที่ไม่น่าเชื่อว่าจะทำสิ่งที่คุณทำอยู่ไม่มากก็น้อย: ผ่านการเรียกของระบบptrace คุณจะไม่ถูกตรึงบนท่อต่อ se แต่ไปยังหนึ่งในกระบวนการ สำหรับการสังเกตใช้straceเช่น
strace -p1234 -s99999 -e write
โดยที่1234
เป็น ID กระบวนการของกระบวนการที่เขียนบนไพพ์ การแก้ไขข้อมูลนั้นยากขึ้น แต่สามารถทำได้ ฉันคิดว่าวิธีที่ง่ายที่สุดคือการตั้งค่ากระบวนการกลางที่คัดลอกอินพุตมาตรฐานไปยังเอาต์พุตมาตรฐานก่อนรวมถึงข้อมูลที่คุณต้องการแทรก (และลบข้อมูลใด ๆ ที่คุณต้องการระงับ) สร้างไปป์ที่มีชื่อสองรายการและเริ่มต้นกระบวนการขั้นกลางที่มี stdin ในหนึ่งไปป์และ stdout ที่อื่น ๆ จากนั้นใช้ดีบักเกอร์ (เช่นGDB ) เพื่อทำให้กระบวนการเป้าหมายทั้งคู่ดำเนินการopen
บนไพพ์ที่มีชื่อที่เหมาะสมจากนั้นจึงdup
วางไพพ์ไปที่ไฟล์ descriptor ที่เหมาะสม โปรดทราบว่ามีโอกาสที่คุณจะเกิดความขัดข้องหนึ่งในกระบวนการในกระบวนการ
(ถ้าคุณไม่เข้าใจย่อหน้าสุดท้ายฉันขอโทษ แต่มันต้องมีระดับของเทคโนโลยีฉันไม่คิดว่าจะมีวิธีที่ง่ายกว่า)
เครื่องมือบางอย่างมีประโยชน์สำหรับการตรวจสอบท่อ:
สำหรับโปรแกรมแล้วทำงานที่หนึ่งไม่ได้ควบคุมท่อให้ดูวิธีการ gdb นี้เปลี่ยนเส้นทางออกจากกระบวนการทำงาน
หรือสามารถใช้strace :
strace -ewrite -p $PID 2>&1 | grep "write(1"
แสดงการโทร descriptor 1 รายการเท่านั้น "2> & 1" คือเปลี่ยนเส้นทาง stderr ไปยัง stdout เนื่องจาก strace เขียนไปยัง stderr โดยค่าเริ่มต้น