Câu hỏi giám sát interprocess đường ống giao thông


Tôi có hai quy trình Linux giao tiếp thông qua một đường ống không tên. Làm thế nào có thể giám sát lưu lượng trong đường ống? Làm thế nào tôi có thể tiêm dữ liệu vào đường ống? Tôi có quyền truy cập root và biết inode ống.


8
2017-12-14 15:10


gốc




Các câu trả lời:


Một đường ống không tên là tự nhiên riêng cho các ứng dụng có bộ mô tả tập tin. Không có nguyên tắc nào để quan sát hoặc sửa đổi lưu lượng trên đường ống. Tôi không nghĩ rằng có một cách để nhìn vào đường ống trực tiếp trên Linux, một trong hai.

Tuy nhiên, có một cách ít nhiều làm những gì bạn đang làm sau đó: thông qua ptrace gọi hệ thống. Bạn sẽ không được tacking vào ống mỗi se, nhưng vào một trong các quy trình. Để quan sát, sử dụng strace, ví dụ.

strace -p1234 -s99999 -e write

Ở đâu 1234 là quá trình ID của một quá trình viết trên đường ống. Sửa đổi dữ liệu khó hơn, nhưng có thể được thực hiện. Tôi nghĩ cách dễ nhất là đầu tiên thiết lập quy trình trung gian sao chép đầu vào tiêu chuẩn của nó vào đầu ra tiêu chuẩn, cộng với dữ liệu bạn muốn chèn (và trừ đi bất kỳ dữ liệu nào bạn muốn chặn). Tạo hai ống được đặt tên và bắt đầu quá trình trung gian đó với stdin trên một đường ống và stdout trên một ống khác. Sau đó, sử dụng trình gỡ lỗi (ví dụ: GDB) để thực hiện cả hai quy trình đích thực thi open trên đường ống được đặt tên thích hợp, sau đó dup để đặt đường ống trên bộ mô tả tệp thích hợp. Lưu ý rằng có khả năng bạn sẽ gặp phải một trong các quy trình trong quy trình.

(Nếu bạn không hiểu đoạn cuối, tôi xin lỗi, nhưng nó đòi hỏi một mức độ kỹ thuật nhất định. Tôi không nghĩ rằng có một cách dễ dàng hơn.)


6
2017-12-15 00:11



Cảm ơn, tôi hiểu. Những gì tôi thực sự đã thử là / proc / $ PID / fd, nơi tôi tìm thấy các mục nhập cho các đường ống chưa đặt tên của một trong các quy trình và tôi đã đọc và dữ liệu bằng cách sử dụng con mèo đơn giản và tiếng vọng trong vỏ, nhưng hành vi có phần không nhất quán. Tôi cần điều tra thêm. - jackhab
@jackhab: Ồ, tôi nghĩ nó không hiệu quả với đường ống. Nhưng khi bạn phát hiện ra nó sẽ không giúp bạn nhiều cho việc theo dõi lưu lượng, bởi vì mỗi byte từ nhà sản xuất sẽ đi đến chính xác một người tiêu dùng và bạn không thể kiểm soát liệu màn hình của bạn hay người tiêu dùng thực sự sẽ nhận được nó. Bạn sẽ có thể tiêm dữ liệu theo cách đó. - Gilles


Một số công cụ hữu ích để theo dõi đường ống:

Ống xem
tee 

Đối với một chương trình đã chạy, nơi một chương trình không kiểm soát đường ống, hãy xem phương thức gdb:
Chuyển hướng đầu ra từ một tiến trình đang chạy.

Hoặc người ta có thể sử dụng strace :

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

chỉ hiển thị các cuộc gọi mô tả 1. "2> & 1" là để chuyển hướng stderr tới stdout, như strace ghi vào stderr theo mặc định.


2
2017-12-14 15:18



Những gì tôi có nghĩa là wiretapping vào đường ống của quá trình đã chạy. Process A khởi chạy quá trình B và nói chuyện với nó thông qua một đường ống vì vậy tôi không có cách nào để sử dụng các tiện ích proxy như tee hoặc pv. - jackhab
Đã thêm một số phương thức khác. - harrymc
Thay vì sử dụng grep, bạn có thể chỉ định "-e write = 1" để giới hạn đầu ra thành dữ liệu được viết thành fd 1. - William Pursell