Chuyển hướng stdin và stdout sang cổng


10

Tôi muốn lấy một chương trình Pđọc từ stdin& ghi vào stdout, nhưng kết nối nó với nchoặc bất cứ thứ gì nó đọc từ một cổng nhất định và xuất ra một cổng khác.

# The reading is easy, here P reads from port 50505
nc -l 50505 | P

Làm thế nào để tôi có được nó để viết lại để nói cổng 60606?


Câu hỏi của bạn không rõ ràng như đã nêu. Bạn có nghĩa là ai đó có thể mở 2 kết nối TCP đến máy của bạn, một đến cổng 50505 và một kết nối tới cổng 50506, gửi dữ liệu trên kết nối đầu tiên dự định được cung cấp Pvà mong đợi đọc đầu ra của Pkết nối TCP thứ hai? Tại sao thẻ UDP?
Stéphane Chazelas

Đúng! Theo như UDPtôi nghĩ tôi muốn ports, nhưng đó không phải là một từ khóa hiện có, vì vậy tôi nghĩ TCP, và tôi nghĩ rằng tôi đã thêm vào UDPphản xạ.
Yimin Rong

Câu trả lời:


12

Ý tôi là ai đó có thể mở 2 kết nối TCP vào máy của bạn, một đến cổng 50505 và một kết nối tới cổng 60606, gửi dữ liệu trên đầu tiên dự định được cung cấp cho P và mong đợi đọc đầu ra của P từ kết nối TCP thứ hai, sau đó sẽ là:

< /dev/null nc -q -1 -l 50505 | P | nc -l 60606 > /dev/null

Hoặc với socat:

socat -u tcp-listen:50505,reuseaddr - | P | socat -u - tcp-listen:60606,reuseaddr

Để Pgửi đầu ra của nó trở lại cùng một kết nối:

socat tcp-listen:50505,reuseaddr exec:P

3

Bạn không cần ncđể làm việc với các cổng. bashcó thể tự làm điều đó:

Bash xử lý một số tên tệp đặc biệt khi chúng được sử dụng trong các chuyển hướng, như được mô tả trong bảng sau:

/dev/fd/fd
    If fd is a valid integer, file descriptor fd is duplicated.
/dev/stdin
    File descriptor 0 is duplicated.
/dev/stdout
    File descriptor 1 is duplicated.
/dev/stderr
    File descriptor 2 is duplicated.
/dev/tcp/host/port
   If host is a valid hostname or Internet address, and port is an integer 
   port number or service name, bash attempts to open a TCP connection to
   the corresponding socket.
/dev/udp/host/port
    If host is a valid hostname or Internet address, and port is an integer 
    port number or service name, bash attempts to open a UDP connection to
    the corresponding socket.

3
/dev/tcpthường bị vô hiệu hóa và không thể được sử dụng để nghe . Bạn cần zshnếu bạn muốn một vỏ có thể tạo ra các ổ cắm tcp nghe.
Stéphane Chazelas

@ StéphaneChazelas Tôi phải thừa nhận tôi chưa bao giờ thử. Nó không nói bất cứ điều gì về hạn chế này trong trang người đàn ông, phải không?
Hauke ​​Laging

Vâng, làm thế nào bạn sẽ làm điều đó? Ổ cắm nghe là một cánh cửa để tạo ra nhiều ổ cắm chấp nhận hơn, các chuyển hướng không hoạt động tốt cho điều đó. zsh sử dụng một nội trang cho điều đó ( ztcp -lđể nghe và ztcp -achấp nhận các kết nối trên ổ cắm nghe).
Stéphane Chazelas
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.