รับหลายไฟล์พร้อมกันใน Netcat โดยไม่ต้องเขียนทับไฟล์ล่าสุด


0

1 เครื่องฟัง (linux) ในขณะที่ไคลเอนต์หลายเครื่อง (windows) ส่งไฟล์ไปยังเครื่องหนึ่งและพอร์ตการฟังเดียวกัน Netcat รับไฟล์ตามลำดับด้วยแท็ก -k

Listening machine: 
  nc -lp PORT -k > fileX
Clients: 
  nc IP PORT < file??

สิ่งที่ฉันต้องการคือการรับไฟล์หลายไฟล์จากหลาย ๆ แหล่งโดยไม่มีการเขียนทับกัน

โปรดดูคำสั่งก่อนหน้า เครื่องฟังที่มีการเขียนเอาต์พุตไปยัง fileX เสมอดังนั้นจึงเขียนทับไฟล์ของไคลเอ็นต์ก่อนหน้า

ฉันต้องการที่จะสามารถเปลี่ยนชื่อไฟล์ที่ส่งออกสำหรับลูกค้าที่แตกต่างกันทุกคน ไคลเอนต์สามารถส่งสตริง "file10" ผ่าน netcat อย่างใดและบอกให้ผู้ฟังส่งออกไปยัง> file10 หรือไม่

ขอขอบคุณ.

แก้ไข: มากับความคิด:

สิ่งนี้เป็นแบบอัตโนมัติผ่านสคริปต์:

  1. ประการแรกผู้ฟังตั้งค่าไฟล์เอาต์พุตเป็น file.txt (nc -lp PORT> file.txt)

  2. ลูกค้าส่งสตริง (เช่น "file123") ผ่าน netcat (นี่จะเป็นชื่อไฟล์สำหรับไฟล์ที่จะส่งในอนาคต)

  3. Listener เขียนไปที่ file.txt จากนั้นอ่าน file.txt และเริ่ม netcat listener ใหม่ด้วยไฟล์เอาต์พุต> file123

  4. ในที่สุดลูกค้าส่งข้อมูล

คำตอบ:


0

คำตอบอื่น ๆ นี้กล่าวถึงจุดที่มีโปรโตคอล / การตั้งค่าแบบกำหนดเองของคุณ ฉันจะไม่ทำซ้ำ ฉันคิดว่าทางออกของคุณคือสิ่งที่คุณต้องการ

nc -kไม่ใช่เครื่องมือที่ดีที่สุดในการรับ "หลายไฟล์จากหลายแหล่ง" เพราะจะรับฟังการเชื่อมต่ออื่นหลังจากที่มีการยกเลิกในปัจจุบัน ซึ่งหมายความว่าจะได้รับไฟล์หลายไฟล์ แต่ต่อไฟล์ไม่ใช่แบบขนาน "หลายแหล่งที่มา" ของคุณจะบล็อกซึ่งกันและกัน

socatด้วยreuseaddrและforkอาจจะดีกว่า

เพื่อเป็นการพิสูจน์แนวคิดมาสร้าง (ในวิธีที่รวดเร็วและสกปรก ) โปรโตคอลที่กำหนดเองของเรา ไฟล์จะถูกถ่ายโอนเป็นสตรีมที่ประกอบด้วย:

  1. ชื่อไฟล์หรือเส้นทางที่จะใช้ในด้านการรับ (โดยไม่ขึ้นบรรทัดใหม่);
  2. บรรทัดใหม่เดียว ( \n, LF, 0x0a) เป็นตัวคั่น;
  3. ข้อมูลไบนารี
  4. 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จะใช้ในการตรวจสอบว่าสำเนา ( น่าจะเป็น ) เหมือนกับต้นฉบับหรือไม่ พวกเขาเป็น.


ดี ฉันจะส่งไฟล์ได้อย่างไรหากไคลเอนต์เป็น windows ฉันพยายามใน powershell .. นี่คือวิธีที่ฉันได้รับ $ file = Get-Content ./somefile; echo "filename10" $ file | ./Netcat32 IP PORT บนเครื่อง linux ฉันได้รับไฟล์ชื่อ "'filename10' $ '\ r'" (โดยไม่ต้องใส่เครื่องหมายอัญประกาศ) เนื้อหาของไฟล์นั้นถูกต้อง แต่ชื่อไฟล์นั้นถูกปิด
MyWays

@MyWays ฉันไม่สามารถช่วยให้คุณมีรหัส PowerShell นี้ (ผมเป็นผู้ชายที่ลินุกซ์ผมไม่เคยทำงานร่วมกับ PowerShell) แต่ปัญหาที่มีลักษณะเหมือนถูกเกิดจากปลายสายที่แตกต่างกันใน Windows และ Unix
Kamil Maciorowski

@ MyWays ถึงแม้ว่ารหัสที่เหมาะสมระหว่างreadและcatใน Linux สามารถแก้ไขได้ ขอสองสามนาที
Kamil Maciorowski

@ MyWays คำตอบของฉันตอนนี้ที่อยู่นี้
Kamil Maciorowski

นี่คือเวทมนตร์คาถาที่นี่
MyWays

0

ไม่ netcat ธรรมดาไม่มีคำสั่งพิเศษดังกล่าว มันไม่ได้ตีความอินพุตของคุณและจริงๆแล้วก็ไม่รู้ด้วยซ้ำว่าอินพุต / เอาต์พุตเป็นไฟล์: คุณทำการเปลี่ยนเส้นทางโดยเชลล์และ netcat จะไม่รบกวนการค้นหา

ดังนั้นคุณต้องใช้โปรแกรมเพิ่มเติมซึ่งจะตีความได้รับการป้อนข้อมูลและเปิดไฟล์ที่ส่งออกได้ด้วยตัวเอง tarในท้ายที่สุดคุณจวนจะบูรณาการ (หรือcpioหรือรูปแบบอื่น ๆ ที่คล้ายกันโหล)

[client] tar -cf - fileXYZ | nc <ip> <port>
[server] nc -lp <port> | tar -xvf -

มีของ Windows สร้างของ GNU มีน้ำมันดินและ Win10 ได้เริ่มต้นเมื่อเร็ว ๆ นี้รวมทั้งbsdtar หากไม่สามารถใช้ได้คุณจะต้องสร้างโปรโตคอลของคุณเองเช่นส่งชื่อไฟล์เป็นบรรทัดแรกตามด้วยข้อมูล คุณจะต้องเขียนรหัสที่กำหนดเองสำหรับผู้ส่งและผู้รับ

การจัดกลุ่มหลายคำสั่งในวงเล็บเป็นหน่วยขั้นตอนเดียวจะช่วย:

[client] (echo fileXYZ && type fileXYZ) | nc <ip> <port>
[server] nc -lp <port> | (read name; name=${name##*/}; name=${name%$'\r'}; cat > "$name")

แต่แทนที่จะผมจะตั้งค่าแซมบ้าบนเครื่อง Linux copy fileXYZ \\<ip>\incoming\fileXYZและกำหนดค่าส่วนแบ่งของประชาชนเพื่อให้ลูกค้าสามารถเพียงแค่


"... สร้างโปรโตคอลของคุณเอง" - The Nick ของ OP คือ MyWays : D
Kamil Maciorowski

@ grawity ขอบคุณสำหรับคำตอบ ฉันจะพยายาม. โปรดอ่านคำตอบของฉันอีกครั้งเมื่อฉันได้เพิ่มแนวคิดและบอกฉันว่าคุณคิดอย่างไร
MyWays

@ KamilMaciorowski ฮ่าฮ่ามันควรจะหมายถึงอะไร?
MyWays

@ MyWays คุณสามารถบูรณาการtarทางของคุณ
Kamil Maciorowski

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