Tại sao <hoặc> bắt buộc phải sử dụng / dev / tcp


13

Khi cố gắng gọi /dev/tcp/www.google.com/80, bằng cách gõ

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

Bash nói no such file or directory. Khi xem mã của người khác trực tuyến, họ sử dụng cú pháp như

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

Tôi nhận thấy rằng điều này cũng hoạt động:

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

Tại sao những biểu tượng này được yêu cầu để gọi một số thứ nhất định trong bash?


2
Bạn có ý nghĩa gì khi gọi điện thoại trực tuyến? Vui lòng cho chúng tôi thấy những gì bạn đang làm, khi bạn gặp lỗi. Bạn đang cố gắng để thực hiện nó? Ngay cả khi trang đầu của google là mã thực thi, tôi sẽ không đề xuất nó.
ctrl-alt-delor

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

Tôi đã chỉnh sửa câu hỏi của bạn, để nói những gì tôi muốn nói.
ctrl-alt-delor

Câu trả lời:


29

Bởi vì đó là một tính năng của shell (của ksh, được sao chép bằng bash) và chỉ vỏ.

/dev/tcp/...không phải là tệp thực, trình bao chặn các nỗ lực chuyển hướng đến /dev/tcp/...tệp và sau đó thực hiện socket(...);connect(...)(tạo kết nối TCP) thay vì open("/dev/tcp/..."...)(mở tệp đó) trong trường hợp đó.

Lưu ý rằng nó phải được đánh vần như vậy. cat < /dev/./tcp/...hoặc là///dev/tcp/... sẽ không hoạt động và thay vào đó sẽ cố gắng mở các tệp đó (mà trên hầu hết các hệ thống không tồn tại và bạn sẽ gặp lỗi).

Hướng chuyển hướng cũng không thành vấn đề. Cho dù bạn sử dụng 3< /dev/tcp/...hoặc 3> /dev/tcp/...hoặc 3<> /dev/tcp/...hoặc thậm chí 3>> /dev/tcp/...sẽ không thực hiện bất kỳ sự khác biệt, bạn sẽ có thể để cả đọc và viết từ / đến đó mô tả tập tin để nhận / gửi dữ liệu qua rằng socket TCP.

Khi bạn làm như vậy cat /dev/tcp/..., điều đó không hoạt động vì catkhông thực hiện cùng một cách xử lý đặc biệt đó, nó sẽ open("/dev/tcp/...")giống như mọi tệp (ngoại trừ- ), chỉ có vỏ (chỉ ksh, bash) và chỉ cho mục tiêu chuyển hướng.

Đó cat -là một ví dụ khác về đường dẫn tệp được xử lý đặc biệt. Thay vì làm a open("-"), nó đọc trực tiếp từ bộ mô tả tệp 0 (stdin). catvà nhiều tiện ích văn bản làm điều đó, shell không cho chuyển hướng của nó. Để đọc nội dung của -tệp, bạn cần cat ./-hoặc cat < -(hoặc cat - < -). Tuy nhiên /dev/stdin, trên các hệ thống không có , bashsẽ thực hiện một số thứ tương tự để chuyển hướng từ tệp (ảo) đó. GNU awkcũng làm như vậy cho /dev/stdin, /dev/stdout, /dev/stderrngay cả trên hệ thống mà không có tập tin như vậy có thể gây ra một số bất ngờ trên các hệ thống như Linux nơi các tập tin hành xử khác nhau.

zshcũng có hỗ trợ ổ cắm TCP (và luồng tên miền Unix), nhưng điều đó được thực hiện với một ztcp(và zsocket) nội dung, do đó, nó ít bị giới hạn hơn so với phương pháp ksh / bash. Đặc biệt, nó cũng có thể hoạt động như một máy chủ mà ksh / bash không thể làm được. Nó vẫn còn hạn chế hơn nhiều so với những gì bạn có thể làm trong một ngôn ngữ lập trình thực sự.


4

Bạn dường như đang nhầm lẫn các ý tưởng hoặc đọc một tập tin và thực hiện một lệnh. Sự khác biệt giữa dữ liệu và hướng dẫn.

Trang nhất của Google không phải là một chương trình thực thi. Và nếu có, nó sẽ không an toàn để chạy nó.

Các ký tự chuyển hướng (bao gồm <>), được sử dụng để hướng dữ liệu vào một lệnh.

Chúng tôi có thể làm cat < /dev/tcp/towel.blinkenlights.nl/23Tuy nhiên điều này sẽ không hoạt động vì /dev/tcp/www.google.com/80cổng này sẽ không phản hồi cho đến khi chúng tôi gửiGET / HTTP/1.0\r\n\r\n

Hãy thử

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

1
Bạn sẽ gặp một lỗi khác nếu tệp tồn tại nhưng không thể thực thi được.
Barmar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.