จะรู้ได้อย่างไรว่า NC ถ่ายโอนไฟล์เสร็จแล้ว


11

มีวิธีที่จะรู้ว่าเมื่อ netcat เสร็จสิ้นการถ่ายโอนไฟล์ระหว่างเครื่องหรือไม่?

คำสั่งปัจจุบัน:

เครื่อง # 2: nc -lp 5555 > test.txt

เครื่อง # 1: nc MachineIP Port < test.txt

การถ่ายโอนเกิดขึ้น แต่ไม่มีสิ่งบ่งชี้ที่ชัดเจนว่าเสร็จสิ้นแล้ว

คำตอบ:


19

ก่อนอื่นให้พื้นหลัง

มีรุ่นต่าง ๆ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 ที่ปลายทั้งสองด้าน


ฉันไม่สามารถทำงานนี้ได้ เมื่อฉัน -q มันบอกว่าคำสั่งไม่ได้อยู่ ฉันเห็น - ดูคล้ายกัน แต่ไม่ได้ทำให้การเชื่อมต่อเลิก
Anthony Russell

ncรุ่นของคุณคืออะไร? วิธีตรวจสอบ: nc -h, บรรทัดแรก

ใช่แล้วมันค่อนข้างเก่า ฉันใช้ภาพเก่าของ linux ฉันจะอัปเดตและให้มันอีก
แอนโทนี่รัสเซล

ฉันปรับปรุงคำตอบของฉัน

1
เมื่อแพ็กเก็ตทั้งหมดไม่เจอระบบปฏิบัติการจะตรวจจับสิ่งนี้และส่งซ้ำโดยไม่สังเกตเห็นแอปพลิเคชัน (หรือหากยังคงล้มเหลวแอปพลิเคชันจะได้รับข้อผิดพลาดการหมดเวลา) การส่งมอบที่เชื่อถือได้คือจุดประสงค์ของโปรโตคอล TCP ที่จัดทำโดย OS kernel ซึ่ง nc ใช้ คุณสามารถร้องขอโปรโตคอล UDP ที่ไม่ทำเช่นนี้ได้โดยใช้ nc -u แต่นี่ไม่ใช่กรณี
Juraj
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.