วิธีอ่านข้อมูลจากซ็อกเก็ตใน Bash บน Linux
เผยแพร่แล้ว: 2022-06-28
บรรทัดคำสั่ง Linux ให้คุณดึงข้อมูลโดยฟังจากซ็อกเก็ตหรือเชื่อมต่อกับซ็อกเก็ต ข้อมูลสามารถจับในไฟล์ข้อความ เราแสดงให้คุณเห็นว่า
ไคลเอนต์ซ็อกเก็ตและเซิร์ฟเวอร์
ซ็อกเก็ตช่วยให้ซอฟต์แวร์เครือข่ายสามารถสื่อสารได้ พวกเขาถูกนำมาใช้ครั้งแรกในระบบปฏิบัติการ 4.2BSD Unix ซึ่งถูกสร้างขึ้นที่ University of California, Berkeley ในปี 1983 พวกเขาได้รับการยอมรับอย่างรวดเร็วโดย System V Unix และ Microsoft Windows
ซ็อกเก็ตเป็นจุดสิ้นสุดของการเชื่อมต่อเครือข่ายซอฟต์แวร์ ซึ่งแยกออกมาเพื่อให้สามารถถือเป็นตัวจัดการไฟล์ได้ นั่นหมายความว่ามันเข้ากับหลักการออกแบบทั่วไปของ Unix และ Linux ว่า "ทุกอย่างเป็นไฟล์" เราไม่ได้หมายถึงเต้ารับจริงบนผนังที่คุณเสียบสายเคเบิลเครือข่ายของคุณ
หากโปรแกรมเชื่อมต่อกับซ็อกเก็ตบนซอฟต์แวร์อื่น จะถือว่าเป็น ไคลเอนต์ ของซอฟต์แวร์อื่น ซอฟต์แวร์ที่อนุญาตให้ซอฟต์แวร์อื่นร้องขอการเชื่อมต่อเรียกว่า เซิร์ฟเวอร์ ข้อกำหนดเหล่านี้ใช้โดยอิสระจากการใช้งานอื่นๆ ของไคลเอนต์และเซิร์ฟเวอร์ในโลกไอที เพื่อหลีกเลี่ยงความสับสน บางครั้งเรียกว่า ซ็อกเก็ตไคลเอ็นต์ และ เซิร์ฟเวอร์ซ็อกเก็ต เพื่อขจัดความกำกวม เราจะเรียกพวกเขาว่าลูกค้าและเซิร์ฟเวอร์
ซ็อกเก็ตถูกนำมาใช้เป็นอินเทอร์เฟซการเขียนโปรแกรมแอปพลิเคชัน (API) ทำให้นักพัฒนาซอฟต์แวร์สามารถเรียกใช้ฟังก์ชันซ็อกเก็ตจากภายในโค้ดของตนได้ ไม่เป็นไรถ้าคุณเป็นโปรแกรมเมอร์ แต่ถ้าคุณไม่ใช่ล่ะ หรือบางทีคุณอาจเป็น แต่กรณีการใช้งานของคุณไม่รับประกันว่าจะต้องเขียนใบสมัคร Linux มีเครื่องมือบรรทัดคำสั่งที่ช่วยให้คุณใช้เซิร์ฟเวอร์ซ็อกเก็ตและไคลเอ็นต์ซ็อกเก็ตพื้นฐาน ตามความต้องการของคุณเพื่อดึงหรือรับข้อมูลจากกระบวนการอื่นๆ ที่เปิดใช้งานซ็อกเก็ต
ที่เกี่ยวข้อง: API คืออะไรและนักพัฒนาใช้งานอย่างไร
ความสัมพันธ์ไม่เคยง่าย
โปรแกรมที่เราจะใช้คือ nc และ ncat ยูทิลิตี้ทั้งสองนี้มีความสัมพันธ์ที่แปลก โปรแกรม nc เป็นการเขียนซ้ำของ ncat ซึ่งเก่ากว่า nc มาก แต่ ncat ก็ถูกเขียนใหม่เช่นกัน และตอนนี้ก็ช่วยให้เราทำบางสิ่งที่ nc ไม่สามารถทำได้ และมีการนำ ncat ไปใช้งานมากมาย ซึ่งตัวมันเองเป็นอนุพันธ์ของเครื่องมือที่เรียกว่า netcat ยิ่งไปกว่านั้น ในการแจกแจงส่วนใหญ่ nc เป็นลิงก์สัญลักษณ์ไปยัง ncat และไม่ใช่โปรแกรมแยกต่างหาก
เราตรวจสอบการแจกจ่าย Arch, Manjaro, Fedora และ Ubuntu ล่าสุด สิ่งเดียวที่ต้องใช้เครื่องมือในการติดตั้งคือ Manjaro บน Manjaro คุณต้องติดตั้งแพ็คเกจ netcat เพื่อรับ nc แต่คุณไม่ได้รับ ncat คุณจะได้รับ netcat และใน Manjaro nc เป็นลิงก์สัญลักษณ์ไปยัง netcat
sudo pacman -S netcat

บรรทัดล่างคือบน Manjaro ใช้ netcat เมื่อคุณเห็น ncat ในตัวอย่างในบทความนี้
ฟังในซ็อกเก็ต
หากซอฟต์แวร์รับฟังการเชื่อมต่อซ็อกเก็ตขาเข้า ซอฟต์แวร์จะทำหน้าที่เป็นเซิร์ฟเวอร์ เซิร์ฟเวอร์จะ รับ ข้อมูลใดๆ ที่มาจากการเชื่อมต่อซ็อกเก็ต เราสามารถจำลองพฤติกรรมนี้ได้อย่างง่ายดายโดยใช้ nc . ข้อมูลที่ได้รับจะแสดงในหน้าต่างเทอร์มินัล
เราจำเป็นต้องบอกให้ nc ฟังการเชื่อมต่อ โดยใช้ตัวเลือก -l (ฟัง) และเราจำเป็นต้องระบุพอร์ตที่เราจะฟังสำหรับการเชื่อมต่อ โปรแกรมไคลเอ็นต์หรือกระบวนการใดๆ ที่พยายามเชื่อมต่อกับอินสแตนซ์ของ nc นี้ต้องใช้พอร์ตเดียวกัน เราบอก nc ว่าพอร์ตใดที่จะรับฟังโดยใช้ตัวเลือก -p (พอร์ต)
คำสั่งนี้เริ่มต้น nc เป็นเซิร์ฟเวอร์ซ็อกเก็ต ฟังการเชื่อมต่อบนพอร์ต 6566:
nc -l -p 6566

ในขณะที่รอการเชื่อมต่อขาเข้า nc จะไม่สร้างเอาต์พุต เมื่อทำการเชื่อมต่อแล้ว ข้อมูลที่ดึงออกมาจะแสดงในหน้าต่างเทอร์มินัล ในที่นี้ มีการสร้างการเชื่อมต่อโดยโปรแกรมไคลเอนต์ที่ระบุตัวเองว่าเป็น “ไคลเอนต์ 1”

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


การส่งข้อมูลไปยังไฟล์
ในการดักจับข้อมูลจากไคลเอนต์ในไฟล์ เราสามารถส่งเอาต์พุตจาก nc ไปยังไฟล์โดยใช้การเปลี่ยนเส้นทาง คำสั่งนี้จะบันทึกข้อมูลที่ได้รับในไฟล์ชื่อ “logfile.txt”
nc -l -p 6566 > logfile.txt

คุณจะไม่เห็นผลลัพธ์ใดๆ—ซึ่งกำลังเข้าสู่ไฟล์—และในทางกลับกัน คุณจะไม่ทราบว่ามีการเชื่อมต่อเกิดขึ้นจนกว่า nc จะยุติลงหรือไม่ การส่งคืนไปยังพรอมต์คำสั่งแสดงว่ามีการเชื่อมต่อเกิดขึ้นและถูกยกเลิกโดยไคลเอ็นต์
เราสามารถใช้ less เพื่อตรวจสอบเนื้อหาของไฟล์ “logfile.txt”
logile.txt น้อยกว่า

จากนั้นคุณสามารถเลื่อนดูข้อมูลและค้นหาโดยใช้ฟังก์ชันในตัวที่น้อยกว่า

ที่เกี่ยวข้อง: วิธีใช้คำสั่งน้อยบน Linux
การส่งข้อมูลไปยังไฟล์และหน้าต่างเทอร์มินัล
หากคุณต้องการดูข้อมูลเลื่อนไปมาในหน้าต่างเทอร์มินัลและให้ส่งไปยังไฟล์พร้อมกัน ให้ไพพ์เอาต์พุตจาก nc ไปที่ tee
nc -l -p 6566 | ที logfile.txt

ยอมรับการเชื่อมต่อหลายรายการ
ไม่เป็นไร แต่มีข้อจำกัด เรายอมรับได้เพียงการเชื่อมต่อเดียวเท่านั้น เราจำกัดการรับข้อมูลจากลูกค้าเพียงรายเดียว นอกจากนี้ เมื่อไคลเอนต์นั้นหยุดการเชื่อมต่อ socket server nc ของเราจะยุติลง
หากคุณต้องการยอมรับการเชื่อมต่อหลายรายการ เราจำเป็นต้องใช้ ncat เราจะต้องบอกให้ ncat ฟัง และใช้พอร์ตเฉพาะ เช่นเดียวกับที่เราทำกับ nc แต่เราจะใช้ตัวเลือก -k (ให้มีชีวิตอยู่) สิ่งนี้บอกให้ ncat ทำงานต่อไปและรับการเชื่อมต่อจากไคลเอนต์แม้ว่าการเชื่อมต่อที่ใช้งานล่าสุดจะลดลง
ซึ่งหมายความว่า ncat จะทำงานจนกว่าเราจะเลือกยุติด้วย "Ctrl-C" การเชื่อมต่อใหม่จะได้รับการยอมรับไม่ว่า ncat จะเชื่อมต่อกับไคลเอนต์ใด ๆ หรือไม่
ncat -k -l -p 6566

เราสามารถเห็นข้อมูลจากไคลเอนต์ต่าง ๆ ที่ปรากฏในผลลัพธ์จาก ncat เมื่อพวกเขาเชื่อมต่อ

การเชื่อมต่อกับเซิร์ฟเวอร์
นอกจากนี้เรายังสามารถใช้ nc เป็นไคลเอนต์ซ็อกเก็ตและเชื่อมต่อกับโปรแกรมอื่นที่ยอมรับการเชื่อมต่อและทำหน้าที่เป็นเซิร์ฟเวอร์ ในสถานการณ์สมมตินี้ nc คือไคลเอ็นต์ซ็อกเก็ต ในการดำเนินการนี้ เราต้องบอก nc ว่าซอฟต์แวร์เซิร์ฟเวอร์อยู่ที่ใดในเครือข่าย
วิธีหนึ่งในการทำเช่นนี้คือการระบุที่อยู่ IP และหมายเลขพอร์ต หากเซิร์ฟเวอร์อยู่บนพีซีเครื่องเดียวกับที่เราใช้ nc เราสามารถใช้ที่อยู่ IP แบบวนรอบของ 127.0.0.1 ไม่ใช่ว่าไม่มีแฟล็กที่ใช้ระบุที่อยู่เซิร์ฟเวอร์และหมายเลขพอร์ต เราเพียงแค่ให้ค่าที่เหมาะสม
ในการเชื่อมต่อกับเซิร์ฟเวอร์บนพีซีเครื่องเดียวกัน และใช้พอร์ต 6566 เราสามารถใช้ที่อยู่ IP แบบวนรอบได้ คำสั่งที่จะใช้คือ:
nc 127.0.0.1 6566

ข้อมูลที่ nc ดึงมาจากเซิร์ฟเวอร์จะเลื่อนไปมาในหน้าต่างเทอร์มินัล

หากคุณทราบชื่อเครือข่ายของคอมพิวเตอร์ที่ใช้ซอฟต์แวร์เซิร์ฟเวอร์ คุณสามารถใช้ชื่อนั้นแทนที่อยู่ IP
nc sulaco 6566

ใช้ “Ctrl+C” เพื่อตัดการเชื่อมต่อ
รวดเร็วและง่ายดาย
nc และ ncat เหมาะสมกับบิลเมื่อคุณไม่ต้องการเขียนตัวจัดการซ็อกเก็ตที่กำหนดเอง แต่คุณต้องรวบรวมข้อมูลจากแหล่งที่เปิดใช้งานซ็อกเก็ต การเปลี่ยนเส้นทางเอาต์พุตไปยังไฟล์ทำให้คุณสามารถตรวจสอบเอาต์พุตได้โดยใช้ไฟล์ less และแยกวิเคราะห์ไฟล์โดยใช้โปรแกรมอรรถประโยชน์ เช่น grep
ที่เกี่ยวข้อง: วิธีใช้คำสั่ง grep บน Linux

