มีวิธีที่จะรู้ว่าเมื่อ netcat เสร็จสิ้นการถ่ายโอนไฟล์ระหว่างเครื่องหรือไม่?
คำสั่งปัจจุบัน:
เครื่อง # 2: nc -lp 5555 > test.txt
เครื่อง # 1: nc MachineIP Port < test.txt
การถ่ายโอนเกิดขึ้น แต่ไม่มีสิ่งบ่งชี้ที่ชัดเจนว่าเสร็จสิ้นแล้ว
มีวิธีที่จะรู้ว่าเมื่อ netcat เสร็จสิ้นการถ่ายโอนไฟล์ระหว่างเครื่องหรือไม่?
คำสั่งปัจจุบัน:
เครื่อง # 2: nc -lp 5555 > test.txt
เครื่อง # 1: nc MachineIP Port < test.txt
การถ่ายโอนเกิดขึ้น แต่ไม่มีสิ่งบ่งชี้ที่ชัดเจนว่าเสร็จสิ้นแล้ว
คำตอบ:
มีรุ่นต่าง ๆnc
ที่คุณสามารถค้นหาได้ในnc (1) - หน้า man Linuxหรือnc (1) คำสั่งทั่วไป BSD คู่มือการเชื่อมต่อควรปิดตัวลงทันทีหลังจากการถ่ายโอน มีตัวอย่างที่ระบุในเว็บไซต์ที่ลิงก์ทั้งสอง:
เริ่มต้นโดยใช้ nc เพื่อฟังบนพอร์ตเฉพาะโดยมีเอาต์พุตที่จับลงในไฟล์:
$ nc -l 1234 > filename.out
ใช้เครื่องที่สองเชื่อมต่อกับกระบวนการรับฟังป้อนไฟล์ที่จะถ่ายโอน:
$ nc host.example.com 1234 < filename.in
หลังจากโอนไฟล์แล้วการเชื่อมต่อจะปิดโดยอัตโนมัติ
คุณnetcat
ไม่ได้ปิดการเชื่อมต่อหลังจากการโอนดังนั้นจึงแตกต่างจากที่อธิบายไว้ข้างต้น มันทำงานเหมือนของฉัน Netcat 1.10 บน Debian Jessie พฤติกรรมนี้ได้รับการบันทึกไว้ใน/usr/share/doc/netcat-traditional/README.gz
(บนเครื่องของฉัน) ตัวหนาคือของฉัน:
ในการใช้งานที่ง่ายที่สุด "พอร์ตโฮสต์ nc" สร้างการเชื่อมต่อ TCP ไปยังพอร์ตที่กำหนดบนโฮสต์เป้าหมายที่กำหนด อินพุตมาตรฐานของคุณจะถูกส่งไปยังโฮสต์และสิ่งใดก็ตามที่กลับมาผ่านการเชื่อมต่อจะถูกส่งไปยังเอาต์พุตมาตรฐานของคุณ สิ่งนี้จะดำเนินต่อไปเรื่อย ๆ จนกว่าเครือข่ายด้านข้างของการเชื่อมต่อจะปิดตัวลง โปรดทราบว่าพฤติกรรมนี้แตกต่างจากแอปพลิเคชั่นอื่น ๆ ส่วนใหญ่ซึ่งปิดทุกอย่างลงและออกหลังจากสิ้นสุดไฟล์ในอินพุตมาตรฐาน
นี่คือเหตุผลที่อยู่เบื้องหลังพฤติกรรมนี้:
คุณอาจถามว่า "ทำไมไม่เพียงใช้ telnet เพื่อเชื่อมต่อกับพอร์ตโดยพลการ?" คำถามที่ถูกต้องและนี่คือเหตุผลบางอย่าง Telnet มีปัญหา "อินพุตมาตรฐาน EOF" ดังนั้นจึงต้องแนะนำการหน่วงเวลาที่คำนวณได้ในสคริปต์การขับรถเพื่อให้เครือข่ายออกให้เสร็จ นี่คือเหตุผลหลักที่ netcat ยังคงทำงานต่อไปจนกว่าเครือข่ายจะปิดลง
วิกิพีเดียมีทำงานลงของการใช้งานที่แตกต่างกัน ฉันไม่สามารถบอกชื่อที่แตกต่างได้ บางทีคนอื่นสามารถ?
1
คุณสามารถบอกnc
ให้เลิกหลังจากอ่านไฟล์แล้ว ตัวเลือกนี้มีประโยชน์:
-q seconds after EOF on stdin, wait the specified number of seconds
and then quit. If seconds is negative, wait forever.
หากคุณใช้คำสั่งนี้เมื่อสิ้นสุดการส่ง:
nc -q 0 MachineIP Port < test.txt
nc
จะออกจาก 0 วินาทีหลังจากอ่าน EOF นั่นคือหลังจากไฟล์สิ้นสุดลง nc
จากนั้นจะออกและเพื่อจะสิ้นสุดการรับ
หากคุณสงสัยว่าจะเกิดอะไรขึ้นถ้าแพ็กเก็ตไม่ผ่านนี่คือข้อคิดเห็นโดย Juraj
เมื่อแพ็กเก็ตทั้งหมดไม่เจอระบบจะตรวจจับสิ่งนี้และส่งซ้ำโดยไม่สังเกตเห็นแอปพลิเคชัน (หรือหากไม่สามารถทำได้แอปพลิเคชันจะได้รับข้อผิดพลาดการหมดเวลา) การส่งมอบที่เชื่อถือได้คือวัตถุประสงค์ของโปรโตคอล TCP ที่จัดทำโดยเคอร์เนลระบบปฏิบัติการซึ่ง
nc
ใช้ คุณสามารถร้องขอโพรโทคอล UDP ที่ไม่ทำเช่นนี้โดยใช้nc -u
แต่นี่ไม่ใช่กรณี
2
มีตัวอย่างดั้งเดิมดังกล่าวข้างต้นREADME.gz
ซึ่งขึ้นอยู่กับการ-w
หมดเวลาและไม่จำเป็นต้องมี-q
ตัวเลือกในการดำเนินการของคุณ
Netcat สามารถใช้เป็นเอเจนต์การถ่ายโอนข้อมูลแบบง่าย ๆ และมันก็ไม่สำคัญว่า end ใดคือ listener และ end ใดที่เป็น client - input ที่ด้านหนึ่งมาถึงอีกฝั่งหนึ่งเป็น output มันจะมีประโยชน์ในการเริ่มฟังที่ด้านการรับโดยไม่ได้ระบุการหมดเวลา ด้วยวิธีนี้ผู้ฟังจะยังคงฟังจนกว่าคุณจะติดต่อและหลังจากข้อมูลหยุดการไหลของไคลเอนต์จะหมดเวลาปิดและนำผู้ฟังมาใช้ เว้นแต่ว่าเครือข่ายที่แทรกแซงนั้นเต็มไปด้วยปัญหาสิ่งนี้ควรเชื่อถือได้อย่างสมบูรณ์และคุณสามารถเพิ่มการหมดเวลาได้เสมอ ตัวอย่างทั่วไปของบางสิ่งบางอย่าง "rsh" มักใช้สำหรับ: ด้านหนึ่ง
nc -l -p 1234 | uncompress -c | tar xvfp -
แล้วอีกด้านหนึ่ง
tar cfp - /some/dir | compress -c | nc -w 3 othermachine 1234
จะถ่ายโอนเนื้อหาของไดเรกทอรีจากเครื่องหนึ่งไปยังอีกเครื่องหนึ่งโดยไม่ต้องกังวลกับไฟล์. rhosts บัญชีผู้ใช้หรือการกำหนดค่า inetd ที่ปลายทั้งสองด้าน