echo command | netcat host port
สิ่งนี้ส่งผลให้คำสั่งถูกส่งไปยังรีโมตโฮสต์และข้อมูลบางส่วนถูกอ่านกลับ แต่หลังจากนั้นไม่กี่วินาทีการเชื่อมต่อจะปิดลง พารามิเตอร์ -w ไม่ได้เปลี่ยนแปลงอะไร ฉันใช้ netcat v1.10 บน SuSE 10.1
echo command | netcat host port
สิ่งนี้ส่งผลให้คำสั่งถูกส่งไปยังรีโมตโฮสต์และข้อมูลบางส่วนถูกอ่านกลับ แต่หลังจากนั้นไม่กี่วินาทีการเชื่อมต่อจะปิดลง พารามิเตอร์ -w ไม่ได้เปลี่ยนแปลงอะไร ฉันใช้ netcat v1.10 บน SuSE 10.1
คำตอบ:
สิ่งนี้ใช้ได้กับnc
คำสั่งบน OS X (สมมติว่าคำสั่งที่คุณต้องการส่งอยู่ในไฟล์):
cat file - | nc host port
(เป็นหลักcat
ทิ้งเนื้อหาของไฟล์ใน stdout แล้วรอให้คุณใน stdin)
ตามส่วนขยายหากคุณต้องการส่งคำสั่งจากเชลล์เองคุณสามารถทำสิ่งนี้ได้:
cat <(echo command) - | nc host port
{ echo command; cat;}
จะทำเช่นเดียวกันและอาจถือว่าง่ายต่อการเข้าใจ
netcat
คำสั่งจะเปิดซ็อกเก็ตไว้จนกว่าจะเห็นจุดสิ้นสุดของอินพุต ตัวอย่างเหล่านี้แสดงให้เห็นถึงทั้งหมดนี้ไม่จริงพูดมากเกี่ยวกับว่าทำไม ฉันกำลังมีปฏิสัมพันธ์กับเซิร์ฟเวอร์ที่ใช้สำหรับการขยายระยะเพียงแค่ใช้: SocketTest เป็นเครื่องมือที่มีประโยชน์ที่สามารถฟังหรือให้บริการบนพอร์ต TCP หรือ UDP ใด ๆ SocketTest
netcat
cat - | nc localhost 8063
ด้วยnc
บน Ubuntu:
nc -q -1 host port
จากอูบุนตูnc
หน้าคน :
-q seconds
after EOF on stdin, wait the specified number of seconds and then quit. If seconds is negative, wait forever.
โปรดทราบว่าnc
ตัวเลือกที่มีจะแตกต่างกันมากระหว่างการกระจายดังนั้นสิ่งนี้อาจไม่ทำงานกับคุณ (OpenSUSE)
เจอแล้ว:
echo command | netcat host port -
เพื่อนร่วมงานของฉันรู้ ฉันไม่เห็นสิ่งนั้นในเอกสารประกอบเลย
ฉันไม่คิดว่าคุณจะจัดการกับ netcat หรือ socat ฉันเพิ่งได้ทำการซ่อมแซมอย่างกว้างขวางกับทั้งสองและ socat ดูมีแนวโน้มมากที่สุด
ฉันจัดการเพื่อตั้งค่า socat ขึ้นเพื่อเชื่อมต่อกับพอร์ต TCP ระยะไกลและฟังบนซ็อกเก็ตโดเมน unix ในพื้นที่ (ในทางทฤษฎีเพื่อให้ลิงก์สามารถเก็บได้ตลอดเวลา) แต่ทันทีที่กระบวนการโลคัลตรวจพบจากซ็อกเก็ตยูนิกซ์ (socat อื่น การเชื่อมโยงซ็อกเก็ต unix กับ stdin / out) มันปิดเซสชัน TCP socat
ปัญหาที่นี่คือการเชื่อมต่อแต่ละครั้งผ่าน netcat / socat ทำให้การเชื่อมต่อกระแส TCP ใหม่ไปยังเซิร์ฟเวอร์และจะปิดเซสชันกระแส TCP ที่เมื่อสิ้นสุดการเชื่อมต่อในท้องถิ่น
ฉันคิดว่าคุณอาจจะต้องเขียนซอฟต์แวร์พร็อกซีที่กำหนดเองเพื่อเปิดการเชื่อมต่อ TCP ไปที่ปลายทางระยะไกลแล้วฟังจากซ็อกเก็ต / ไปป์ / Fifo หรืออะไรก็ตามแล้วส่งข้อมูลลงไปที่ TCP และส่งคืนผลลัพธ์
เป็นไปได้ไหมว่าการเชื่อมต่อถูกปิดที่ปลายอีกด้านของซ็อกเก็ต?
ตามค่าเริ่มต้นให้nc
ปิดการเชื่อมต่อหลังจากเสร็จสิ้นหากคุณไม่ได้บอกให้เขาฟังอย่างต่อเนื่อง (ด้วย-k
ตัวเลือก):
-k Forces nc to stay listening for another connection after its current
connection is completed. It is an error to use this option without the
-l option.
man nc.1
ดู
ฉันกำลังสตรีมข้อมูลระหว่างเครื่องสองเครื่องดังนี้:
ผู้ส่ง:
while (true); do
echo -n "$RANDOM " | nc <host> <port>
done
รับ:
nc -kl <port>
วิธีการจอร์ชทำงานได้ดีจากเปลือกโต้ตอบ nohup ./script &
แต่จะไม่ได้ความช่วยเหลือเกี่ยวกับการเขียนสคริปต์เช่นเมื่อคุณกำลังเรียกสคริปต์ของคุณเป็น
ฉันพบว่าการเปลี่ยน stdin ด้วย Fifo ตัวช่วย
mkfifo dummy
cat command.txt dummy | nc host port
เนื่องจากไม่มีสิ่งใดที่เขียนไปถึง Fifo หลังจากส่งไฟล์cat
ออกมาแล้ว
socat
's shut-none
ตัวเลือกที่จะช่วยให้ที่นี่:
Changes the (address dependent) method of shutting down the write part of a connection to not do anything.
คุณอาจต้องแทนที่ช่วงเวลาหมดเวลาเริ่มต้นที่ใช้-t <timeout>
มิฉะนั้นซ็อกเก็ตจะถูกปิดหลังจาก 0.5 วินาที ตัวเลือกนี้จะแทนที่พฤติกรรมเริ่มต้นซึ่งก็คือ:
When one of the streams effectively reaches EOF, the closing phase begins. Socat transfers the EOF condition to the other stream, i.e. tries to shutdown only its write stream, giving it a chance to terminate gracefully. For a defined time socat continues to transfer data in the other direction, but then closes all remaining channels and terminates.
ดังนั้นคำสั่งเช่น:
echo 'blah' | socat -t 10 stdio tcp:<addr>:<port>,shut-none
จะทำให้ซ็อกเก็ตเปิดเป็นเวลา 10 วินาทีหลังจากส่ง 'blah'
คำสั่งของคุณจะสิ้นสุดลงหากโฮสต์ระยะไกลปิดการเชื่อมต่อ (หรือไม่สามารถเข้าถึงได้) หรือคำสั่งก่อนที่จะยกเลิกการไพพ์ (ในขณะที่ netcat ยังคงส่งส่วนที่เหลือของคิวอินพุต)