giám sát giao thông đường ống


13

Tôi có hai quy trình Linux giao tiếp qua một đường ống không tên. Làm thế nào có thể giám sát giao thô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.

Câu trả lời:


7

Một ống không tên về bản chất là riêng tư đối với các ứng dụng có bộ mô tả tệp. Không có cách nguyên tắc nào để quan sát hoặc sửa đổi lưu lượng trên đường ống. Tôi cũng không nghĩ có cách nào để nhìn vào đường ống trực tiếp trên Linux.

Mặc dù, có một cách bất hợp lý là ít nhiều làm những gì bạn đang theo đuổi, thông qua: thông qua cuộc gọi hệ thống ptrace . Bạn sẽ không giải quyết vấn đề, nhưng vào một trong các quy trình. Để quan sát, sử dụng strace , vd

strace -p1234 -s99999 -e write

nơi 1234là quá trình ID của một quá trình viết trên ố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à trước tiên hãy thiết lập một quy trình trung gian sao chép đầu vào tiêu chuẩn của nó sang đầu ra tiêu chuẩn của nó, cộng với dữ liệu bạn muốn tiêm (và trừ bất kỳ dữ liệu nào bạn muốn loại bỏ). 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 và thiết bị xuất chuẩn trên ống kia. Sau đó, sử dụng trình gỡ lỗi (ví dụ GDB ) để làm cho cả hai quá trình đích thực thi opentrên đường ống có 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 sự cố 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ĩ có một cách dễ dàng hơn.)


Cảm ơn, tôi hiểu. Những gì tôi thực sự đã cố gắng là / Proc / $ PID / fd, nơi tôi tìm thấy các mục nhập tệp cho các ống không tên của một trong các quy trình và tôi đã quản lý để đọc và dữ liệu bằng cách sử dụng cat và echo đơn giản trong vỏ, nhưng phần nào hành vi không nhất quán Tôi cần điều tra thêm.
jackhab

1
@jackhab: Ồ, tôi nghĩ rằng nó không hoạt động cho đường ống. Nhưng như 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 truy cập, bởi vì mỗi byte từ nhà sản xuất sẽ chuyển đến chính xác một người tiêu dùng và bạn không thể kiểm soát xem màn hình của mình hay người tiêu dùng thực tế sẽ có được nó hay không. Bạn sẽ có thể tiêm dữ liệu theo cách đó sau đó.
Gilles 'SO- ngừng trở thành ác quỷ'

2

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

Ống xem
tee

Đối với chương trình đã chạy mà người ta không điều khiển đường ống, hãy xem phương thức gdb:
Chuyển hướng đầu ra từ một quy 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ị mô tả 1 cuộc gọi. "2> & 1" là để chuyển hướng stderr sang stdout, vì strace ghi vào stderr theo mặc định.


1
Ý tôi là nghe lén đến đường ống của quá trình đã chạy. Quá trình A khởi chạy tiến 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 pháp.
harrymc

Thay vì sử dụng grep, bạn có thể chỉ định "-e write = 1" để giới hạn đầu ra cho dữ liệu được ghi vào fd 1.
William Pursell
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.