ฉันจะไพพ์คำสั่งไปยัง netcat ที่จะมีชีวิตอยู่ได้อย่างไร


32
echo command | netcat host port

สิ่งนี้ส่งผลให้คำสั่งถูกส่งไปยังรีโมตโฮสต์และข้อมูลบางส่วนถูกอ่านกลับ แต่หลังจากนั้นไม่กี่วินาทีการเชื่อมต่อจะปิดลง พารามิเตอร์ -w ไม่ได้เปลี่ยนแปลงอะไร ฉันใช้ netcat v1.10 บน SuSE 10.1


คุณแน่ใจหรือว่าไม่ใช่โฮสต์ระยะไกลที่ปิดการเชื่อมต่อ
grawity

ใช่. การทำ netcat จากนั้นพิมพ์คำสั่งด้วยตนเองส่งผลให้ netcat คงอยู่อย่างไม่มีกำหนด
Chris

ทำไมมันจะมีชีวิตอยู่? มันแค่พิมพ์พารามิเตอร์ echo แล้วตายเหรอ?
M'vy

1
ฉันต้องการให้มีชีวิตอยู่เพื่อที่จะได้รับข้อมูลที่มาจากเซิร์ฟเวอร์ระยะไกล
Chris

2
ที่ไม่เป็นความจริง. "netcat <host> <port>" เปิดซ็อกเก็ต TCP สองทิศทาง
Chris

คำตอบ:


33

สิ่งนี้ใช้ได้กับncคำสั่งบน OS X (สมมติว่าคำสั่งที่คุณต้องการส่งอยู่ในไฟล์):

cat file - | nc host port

(เป็นหลักcatทิ้งเนื้อหาของไฟล์ใน stdout แล้วรอให้คุณใน stdin)

ตามส่วนขยายหากคุณต้องการส่งคำสั่งจากเชลล์เองคุณสามารถทำสิ่งนี้ได้:

cat <(echo command) - | nc host port

มันเยี่ยมมากเพราะมันทำงานบนระบบฝังกระดูกที่เปลือยเปล่าซึ่ง netcat ขาดตัวเลือกแฟนซีทั้งหมด
เอสเอฟ

{ echo command; cat;}จะทำเช่นเดียวกันและอาจถือว่าง่ายต่อการเข้าใจ
G-Man กล่าวว่า 'Reinstate Monica'

1
ตามที่ฉันเห็นมันnetcatคำสั่งจะเปิดซ็อกเก็ตไว้จนกว่าจะเห็นจุดสิ้นสุดของอินพุต ตัวอย่างเหล่านี้แสดงให้เห็นถึงทั้งหมดนี้ไม่จริงพูดมากเกี่ยวกับว่าทำไม ฉันกำลังมีปฏิสัมพันธ์กับเซิร์ฟเวอร์ที่ใช้สำหรับการขยายระยะเพียงแค่ใช้: SocketTest เป็นเครื่องมือที่มีประโยชน์ที่สามารถฟังหรือให้บริการบนพอร์ต TCP หรือ UDP ใด ๆ SocketTest netcatcat - | nc localhost 8063
จะ

14

ด้วย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)


12

เจอแล้ว:

echo command | netcat host port -

เพื่อนร่วมงานของฉันรู้ ฉันไม่เห็นสิ่งนั้นในเอกสารประกอบเลย


2

ฉันไม่คิดว่าคุณจะจัดการกับ netcat หรือ socat ฉันเพิ่งได้ทำการซ่อมแซมอย่างกว้างขวางกับทั้งสองและ socat ดูมีแนวโน้มมากที่สุด

ฉันจัดการเพื่อตั้งค่า socat ขึ้นเพื่อเชื่อมต่อกับพอร์ต TCP ระยะไกลและฟังบนซ็อกเก็ตโดเมน unix ในพื้นที่ (ในทางทฤษฎีเพื่อให้ลิงก์สามารถเก็บได้ตลอดเวลา) แต่ทันทีที่กระบวนการโลคัลตรวจพบจากซ็อกเก็ตยูนิกซ์ (socat อื่น การเชื่อมโยงซ็อกเก็ต unix กับ stdin / out) มันปิดเซสชัน TCP socat

ปัญหาที่นี่คือการเชื่อมต่อแต่ละครั้งผ่าน netcat / socat ทำให้การเชื่อมต่อกระแส TCP ใหม่ไปยังเซิร์ฟเวอร์และจะปิดเซสชันกระแส TCP ที่เมื่อสิ้นสุดการเชื่อมต่อในท้องถิ่น

ฉันคิดว่าคุณอาจจะต้องเขียนซอฟต์แวร์พร็อกซีที่กำหนดเองเพื่อเปิดการเชื่อมต่อ TCP ไปที่ปลายทางระยะไกลแล้วฟังจากซ็อกเก็ต / ไปป์ / Fifo หรืออะไรก็ตามแล้วส่งข้อมูลลงไปที่ TCP และส่งคืนผลลัพธ์


ฟัง Matt Jenkins ผู้ยิ่งใหญ่ทั้งหมด: D
M'vy

2

เป็นไปได้ไหมว่าการเชื่อมต่อถูกปิดที่ปลายอีกด้านของซ็อกเก็ต?

ตามค่าเริ่มต้นให้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> 
    

1

วิธีการจอร์ชทำงานได้ดีจากเปลือกโต้ตอบ nohup ./script &แต่จะไม่ได้ความช่วยเหลือเกี่ยวกับการเขียนสคริปต์เช่นเมื่อคุณกำลังเรียกสคริปต์ของคุณเป็น

ฉันพบว่าการเปลี่ยน stdin ด้วย Fifo ตัวช่วย

 mkfifo dummy
 cat command.txt dummy | nc host port

เนื่องจากไม่มีสิ่งใดที่เขียนไปถึง Fifo หลังจากส่งไฟล์catออกมาแล้ว


0

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'


0

คำสั่งของคุณจะสิ้นสุดลงหากโฮสต์ระยะไกลปิดการเชื่อมต่อ (หรือไม่สามารถเข้าถึงได้) หรือคำสั่งก่อนที่จะยกเลิกการไพพ์ (ในขณะที่ netcat ยังคงส่งส่วนที่เหลือของคิวอินพุต)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.