วิธียกเลิกการเชื่อมต่อ TCP ที่สร้างโดย bash เอง?


17

ฉันเคยexec 3<>/dev/tcp/192.168.0.101/6435สร้างการเชื่อมต่อ TCP กับ 192.168.0.101:6435 และฉันได้รับรวมทั้งส่งข้อความสองสามข้อความด้วยpipeคำคำสั่ง

ตอนนี้ฉันต้องการยกเลิกการเชื่อมต่อ TCP แต่ด้วยss -anpetฉันสามารถเห็นว่าทุบตีตัวเองถือการเชื่อมต่อนี้โดยไม่ต้องแยกกระบวนการเด็ก

ฉันพยายามส่งสัญญาณ 9 และ 15 ไปยังกระบวนการทุบตี แต่อย่างที่ทราบกันว่าทุบตีไม่สามารถฆ่าตัวตายได้

ดังนั้นฉันสามารถยุติการเชื่อมต่อ TCP ที่ฉันสร้างขึ้นได้โดยไม่ยกเลิก pts ที่ฉันกำลังใช้ (ไม่ฆ่าด้วย root หรือส่ง Ctrl + D)?


คุณจะได้รับกระสุนอีกอัน & ฆ่าbashด้วยกระสุนนั้น
trysis

3
bashแน่นอนสามารถฆ่าตัวตาย - แม้ว่านั่นไม่ใช่สิ่งที่คุณต้องการทำที่นี่จริง ๆ !
psmears

@TJM เพื่อทำให้คำถามที่น่าสนใจนี้มีประโยชน์กับผู้อื่นมากขึ้นคุณช่วยอธิบายรายละเอียดเกี่ยวกับpipeคำสั่งที่คุณใช้และสิ่งที่ฉันไม่สามารถหาได้ในระบบของฉัน? แพ็คเกจใดpipeมาจากไหน คุณสามารถส่งพารามิเตอร์อะไร (ตัวอย่าง) เพื่อส่ง / รับข้อมูลผ่านการ/dev/tcp/...เชื่อมต่อ ขอบคุณ
arielf

@ arielf โดยทั่วไปแล้วฉันเป็นผู้เริ่มต้นของวิทยาการคอมพิวเตอร์และฉันพบว่าการใช้งานแบบนี้จากสคริปต์ bash shell ที่เรียกว่า sedbot คุณสามารถค้นหาได้จาก Github ใช่ฉันไม่พบไฟล์ใด ๆ/dev/tcpแม้จะไม่สามารถค้นหา/dev/tcpไฟล์ได้ แต่ดูเหมือนว่าการใช้งานพิเศษที่คุณสามารถส่ง / รับข้อมูลด้วยpipeและไฟล์ประเภทนี้ มันบอกว่าใช้/dev/tcp/ip/portสำหรับการเชื่อมต่อ TCP และ/dev/udp/ip/portสำหรับแพคเกจ UDP สำหรับภาษาอังกฤษของฉันไม่ดีมากฉันไม่รู้วิธีอธิบายอย่างถูกต้อง โปรดแก้ไขคำถามและโพสต์คำตอบ
TJM

@TJM ขอบคุณ คำถามเกี่ยวกับpipeคำสั่งที่คุณพูดถึง https://github.com/clsr/sedbot/blob/master/sedbot.bashผมมองไปที่ ไม่มีpipeคำสั่งที่นั่น มันกำหนดสองฟังก์ชั่น: readmsgและsendmsgการอ่าน / เขียนจาก / ไปยังการเชื่อมต่อตามลำดับ readmsgใช้IFS= read -r -u 3 -t "$READ_TIMEOUT" lineในการอ่านจาก file-descriptor 3 ไปยังตัวแปรlineและsendmsgใช้echo "$(date +%s.%N) >>> $line" >&4เพื่อเขียนลงใน file descriptor 4 อย่างไรก็ตามนี่จะชี้แจงวิธีการแบบเต็ม การpipeกล่าวถึง "คำสั่ง" ยังคงเป็นปริศนาสำหรับผู้อ่าน
arielf

คำตอบ:


18

คำสั่งนั้นเปิดการเชื่อมต่อกับ file descriptor 3 ดังนั้นหากต้องการปิดการเชื่อมต่อคุณจำเป็นต้องปิด file descriptor 3 โดยทำดังนี้

exec 3<&-

1
สิ่งนี้จะทำการshutdown(3)เรียกที่เหมาะสมหรือเพียงแค่close(2)อธิบายไฟล์?
เควิน

ทำ a closeแต่shutdownไม่เหมาะสมกว่าปิด shutdownการใช้งานจริงเท่านั้นคือเมื่อคุณต้องการปิดด้านเดียวของซ็อกเก็ตดูเพล็กซ์
แพทริค

4
shutdownส่ง FIN ขณะที่closeส่ง RST สิ่งเหล่านี้แตกต่างอย่างมาก
เควิน

2
@Kevin RST เกิดจากการปิดซ็อกเก็ตโดยไม่ต้องอ่านข้อมูลทั้งหมดจากมันก่อน หากคุณอ่านจนจบข้อมูลแล้วทำการปิดการปิดจะส่ง FIN
kasperd

@kasperd: ใน API ซ็อกเก็ต UNIX วิธีเดียวที่จะรู้ว่ามีข้อมูลที่รอดำเนินการคือพยายามอ่านจากซ็อกเก็ตที่ไม่มีการบล็อกหรือเรียกสิ่งที่ชอบselect()และฉันไม่เชื่อว่า bash จะมีตัวเลือกให้เลือก
เควิน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.