เปลี่ยนเส้นทาง stdin และ stdout ไปยังพอร์ต


10

ฉันต้องการใช้โปรแกรมPที่อ่านจากstdin& เขียนถึงstdoutแต่เชื่อมต่อกับncหรืออะไรก็ตามที่อ่านจากพอร์ตที่แน่นอนและส่งออกไปยังพอร์ตอื่น

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

ฉันจะทำให้เขียนกลับไปบอกพอร์ต 60606 ได้อย่างไร


คำถามของคุณไม่ชัดเจนตามที่ระบุไว้ คุณหมายถึงใครบางคนอาจเปิดการเชื่อมต่อ TCP 2 เครื่องไปยังพอร์ต 50505 และอีกพอร์ตหนึ่งที่พอร์ต 50506 ส่งข้อมูลไปยังพอร์ตแรกที่ตั้งใจจะป้อนเข้าPและคาดว่าจะอ่านเอาต์พุตPจากการเชื่อมต่อ TCP ที่สอง? ทำไมต้องแท็ก UDP
Stéphane Chazelas

ใช่ เท่าที่UDPฉันคิดว่าฉันต้องการportsแต่นั่นไม่ใช่คำหลักที่มีอยู่ดังนั้นฉันจึงคิดTCPและฉันคิดว่าฉันได้เพิ่มUDPการสะท้อนกลับ
Yimin Rong

คำตอบ:


12

ฉันหมายความว่ามีใครบางคนอาจเปิดการเชื่อมต่อ TCP 2 เครื่องไปยังพอร์ต 50505 และอีกพอร์ตหนึ่งที่พอร์ต 60606 ส่งข้อมูลในพอร์ตแรกที่ต้องการป้อนไปยัง P และคาดว่าจะอ่านเอาต์พุตของ P จากการเชื่อมต่อ TCP ที่สอง ถ้าเช่นนั้นจะเป็น:

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

หรือด้วยsocat:

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

สำหรับPส่งเอาต์พุตกลับไปยังการเชื่อมต่อเดียวกัน:

socat tcp-listen:50505,reuseaddr exec:P

3

คุณไม่จำเป็นต้องncทำงานกับพอร์ต bashสามารถทำได้เอง:

Bash จัดการชื่อไฟล์หลายชื่อเป็นพิเศษเมื่อใช้ในการเปลี่ยนเส้นทางดังที่อธิบายไว้ในตารางต่อไปนี้:

/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/tcpมักจะปิดการใช้งานและไม่สามารถใช้สำหรับการฟังได้ คุณต้องการzshถ้าคุณต้องการเชลล์ที่สามารถสร้างซ็อกเก็ต tcp ที่ฟังได้
Stéphane Chazelas

@ StéphaneChazelasฉันต้องยอมรับว่าฉันไม่เคยลอง ไม่ได้พูดอะไรเกี่ยวกับข้อ จำกัด นี้ในหน้าคู่มือใช่ไหม?
Hauke ​​Laging

คุณจะทำอย่างไรดี ซ็อกเก็ตตัวรับฟังเป็นประตูที่จะสร้างซ็อกเก็ตที่ยอมรับได้มากขึ้น zsh ใช้ builtin สำหรับสิ่งนั้น ( ztcp -lสำหรับการฟังและ ztcp -aยอมรับการเชื่อมต่อบนซ็อกเก็ตการฟัง)
Stéphane Chazelas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.