เหตุใด <หรือ> จำเป็นต้องใช้ / dev / tcp


13

เมื่อพยายามโทร/dev/tcp/www.google.com/80โดยพิมพ์

/dev/tcp/www.google.com/80

no such file or directoryทุบตีกล่าวว่า เมื่อดูที่รหัสของคนอื่นทางออนไลน์พวกเขาใช้ไวยากรณ์เช่น

 3<>/dev/tcp/www.google.com/80

ฉันสังเกตเห็นว่ามันใช้งานได้ดีเช่นกัน:

</dev/tcp/www.google.com/80

ทำไมสัญลักษณ์เหล่านี้จำเป็นต้องเรียกบางสิ่งในทุบตี?


2
คุณหมายถึงอะไรโดย "โทร"? กรุณาแสดงให้เราเห็นสิ่งที่คุณกำลังทำเมื่อคุณได้รับข้อผิดพลาด คุณพยายามเรียกใช้งานหรือไม่ แม้ว่าหน้าแรกของ google เป็นรหัสที่ปฏิบัติการได้ฉันก็จะไม่แนะนำ
ctrl-alt-delor

/dev/tcp/www.google.com/80
john doe

ฉันแก้ไขคำถามของคุณเพื่อพูดในสิ่งที่ฉันหมายถึง
ctrl-alt-delor

คำตอบ:


29

เพราะนั่นเป็นคุณสมบัติของเชลล์ (ของ ksh, คัดลอกโดย bash) และเชลล์เท่านั้น

/dev/tcp/...ไม่ใช่ไฟล์จริงเชลล์สกัดกั้นความพยายามในการเปลี่ยนเส้นทางไปยัง/dev/tcp/...ไฟล์จากนั้นทำการsocket(...);connect(...)(ทำการเชื่อมต่อ TCP) แทนการopen("/dev/tcp/..."...)(เปิดไฟล์นั้น) ในกรณีนั้น

โปรดทราบว่าจะต้องมีการสะกดเช่นนั้น cat < /dev/./tcp/...หรือ///dev/tcp/...ไม่ทำงานและจะพยายามเปิดไฟล์เหล่านั้นแทน (ซึ่งในระบบส่วนใหญ่ไม่มีอยู่และคุณจะได้รับข้อผิดพลาด)

ทิศทางของการเปลี่ยนเส้นทางก็ไม่สำคัญเช่นกัน ไม่ว่าคุณจะใช้3< /dev/tcp/...หรือ3> /dev/tcp/...หรือ3<> /dev/tcp/...หรือ3>> /dev/tcp/...จะไม่สร้างความแตกต่างใด ๆ ก็ตามคุณจะสามารถอ่านและเขียนจาก / ถึงตัวอธิบายไฟล์นั้นเพื่อรับ / ส่งข้อมูลผ่านซ็อกเก็ต TCP นั้น

เมื่อคุณทำเช่นcat /dev/tcp/...นั้นจะไม่ทำงานเพราะcatไม่ได้ใช้การจัดการพิเศษแบบเดียวกันมันไม่open("/dev/tcp/...")เหมือนกับไฟล์ทุกไฟล์ (ยกเว้น-) เฉพาะเชลล์ (ksh, bash เท่านั้น) เท่านั้นและสำหรับเป้าหมายของการเปลี่ยนเส้นทางเท่านั้น

นั่นcat -เป็นอีกตัวอย่างหนึ่งของพา ธ ไฟล์ที่จัดการเป็นพิเศษ แทนที่จะopen("-")อ่านa จะอ่านโดยตรงจาก file descriptor 0 (stdin) catและยูทิลิตี้ข้อความจำนวนมากทำเช่นนั้นเชลล์ไม่ได้ใช้เปลี่ยนเส้นทาง หากต้องการอ่านเนื้อหาของ-ไฟล์คุณต้องcat ./-หรือcat < -(หรือcat - < -) ในระบบที่ไม่ได้มี/dev/stdin, bashแต่จะทำบางสิ่งบางอย่างที่คล้ายกันสำหรับการเปลี่ยนเส้นทางจากที่ (เสมือน) ไฟล์ GNU awkไม่เหมือนกันสำหรับ/dev/stdin, /dev/stdout, /dev/stderrแม้ในระบบที่มีไฟล์ดังกล่าวซึ่งอาจทำให้เกิดความผิดบางประการเกี่ยวกับระบบเช่นลินุกซ์ที่ไฟล์เหล่านั้นทำงานแตกต่างกัน

zshนอกจากนี้ยังมีการรองรับซ็อกเก็ต TCP (และโดเมน Unix) แต่ก็ทำด้วยztcp(และzsocket) builtins ดังนั้นจึงมีข้อ จำกัด น้อยกว่าวิธี ksh / bash โดยเฉพาะอย่างยิ่งมันสามารถทำหน้าที่เป็นเซิร์ฟเวอร์ที่ ksh / bash ไม่สามารถทำได้ มันยังมีข้อ จำกัด มากกว่าสิ่งที่คุณสามารถทำได้ในภาษาการเขียนโปรแกรมจริง


4

คุณดูเหมือนจะสับสนความคิดหรืออ่านไฟล์และดำเนินการคำสั่ง ความแตกต่างระหว่างข้อมูลและการสอน

หน้าแรกของ Google ไม่ใช่โปรแกรมที่ปฏิบัติการได้ และถ้ามันเป็นมันจะไม่ปลอดภัยที่จะเรียกใช้

อักขระการเปลี่ยนทิศทาง (รวมถึง<และ>) ใช้เพื่อนำข้อมูลไปยังคำสั่ง

เราสามารถทำได้cat < /dev/tcp/towel.blinkenlights.nl/23อย่างไรก็ตามสิ่งนี้จะไม่ทำงาน/dev/tcp/www.google.com/80เนื่องจากพอร์ตนี้จะไม่ตอบสนองจนกว่าเราจะส่งGET / HTTP/1.0\r\n\r\n

ลองดูสิ

{
  printf >&3 'GET / HTTP/1.0\r\n\r\n'
  cat <&3
} 3<>/dev/tcp/www.google.com/80

1
คุณจะได้รับข้อผิดพลาดที่แตกต่างกันถ้าไฟล์นั้นมีอยู่ แต่ไม่สามารถใช้งานได้
Barmar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.