คำตอบอื่น ๆ นี้กล่าวถึงจุดที่มีโปรโตคอล / การตั้งค่าแบบกำหนดเองของคุณ ฉันจะไม่ทำซ้ำ ฉันคิดว่าทางออกของคุณคือสิ่งที่คุณต้องการ
nc -k
ไม่ใช่เครื่องมือที่ดีที่สุดในการรับ "หลายไฟล์จากหลายแหล่ง" เพราะจะรับฟังการเชื่อมต่ออื่นหลังจากที่มีการยกเลิกในปัจจุบัน ซึ่งหมายความว่าจะได้รับไฟล์หลายไฟล์ แต่ต่อไฟล์ไม่ใช่แบบขนาน "หลายแหล่งที่มา" ของคุณจะบล็อกซึ่งกันและกัน
socat
ด้วยreuseaddr
และfork
อาจจะดีกว่า
เพื่อเป็นการพิสูจน์แนวคิดมาสร้าง (ในวิธีที่รวดเร็วและสกปรก ) โปรโตคอลที่กำหนดเองของเรา ไฟล์จะถูกถ่ายโอนเป็นสตรีมที่ประกอบด้วย:
- ชื่อไฟล์หรือเส้นทางที่จะใช้ในด้านการรับ (โดยไม่ขึ้นบรรทัดใหม่);
- บรรทัดใหม่เดียว (
\n
, LF, 0x0a) เป็นตัวคั่น;
- ข้อมูลไบนารี
- EOF
นี่คือคำสั่งที่ได้รับ:
socat TCP-LISTEN:50011,reuseaddr,fork SYSTEM:'read -r f && cat >"$f"'
(แก้ไข) นี่คือคำสั่งการรับทั่วไปที่ตัดการต่อท้าย\r
(ถ้ามี) จากชื่อไฟล์ (มีประโยชน์สำหรับการทำงานกับไคลเอนต์ Windows ที่ไม่สอดคล้องกับโปรโตคอลทั้งหมด):
socat TCP-LISTEN:50011,reuseaddr,fork SYSTEM:'read -r f && f="${f%$(printf "\r")}" && cat >"$f"'
(แก้ไขสิ้นสุดที่นี่)
วิธีส่งไฟล์:
(echo "The new name.foo" && cat "./the file to send.bar") > /dev/tcp/192.168.22.33/50011
หมายเหตุ:
50011
เป็นหมายเลขพอร์ต TCP คุณสามารถเลือกได้เอง
192.168.22.33
เป็นที่อยู่ของเซิร์ฟเวอร์เปลี่ยนให้ตรงกับการตั้งค่าของคุณ
- ฉันใช้
/dev/tcp/…/…
ไวยากรณ์ที่ทำงานใน Bash ไปป์nc
ถ้าคุณต้องการ / ต้องการ;
- การชนกันของชื่อไฟล์ยังคงเป็นปัญหาอยู่คุณจำเป็นต้องมีตรรกะของสคริปต์ (แทนที่จะเป็นธรรมดา
cat
) เพื่อแก้ไขปัญหา
SYSTEM
มีข้อ จำกัด (ดูman socat
); แทนที่จะส่งเนื้อหาสคริปต์ขนาดใหญ่ไปให้เขียนสคริปต์ไปยังไฟล์และเรียกใช้ไฟล์ คุณยังสามารถตรวจสอบEXEC
;
- โปรโตคอลของเรา (มีความรวดเร็วและสกปรก) ไม่มีวิธีใดที่เซิร์ฟเวอร์จะรายงานข้อผิดพลาด (ถ้ามี) หรือความสำเร็จให้กับลูกค้า
ฉันทดสอบสิ่งนี้กับผู้รับ Debian และผู้ส่ง Ubuntu ในช่วงเวลาหนึ่งสามการเชื่อมต่อที่แตกต่างกันกำลังถ่ายโอนไฟล์ที่แตกต่างกันสามไฟล์จากที่อยู่ IP ที่แตกต่างกันสองแห่ง หลังจากการถ่ายโอนทั้งหมดเสร็จสมบูรณ์md5sum
จะใช้ในการตรวจสอบว่าสำเนา ( น่าจะเป็น ) เหมือนกับต้นฉบับหรือไม่ พวกเขาเป็น.