2011-10-14 40 views
26

Tôi đã tìm thấy dòng này trong tập lệnh. Trong khi tôi hiểu toàn bộ những gì nó làm - mở một kết nối TCP hai chiều--, tôi cần một số giải thích về cú pháp. Đây là dòng:Kết nối TCP, chỉ bash

exec 5<>"/dev/tcp/${SERVER}/${PORT}" 

Và câu hỏi của tôi:

  1. <> thường được sử dụng để chuyển hướng IOs. Nó có nghĩa là gì? Nó có thể sử dụng được trong ngữ cảnh khác không? Làm sao?
  2. Tại sao nó hoạt động, trong khi /dev/tcp không tồn tại?
  3. Tại sao lại là 5? Nó có thể là một số khác không? Các giá trị được cho phép là gì?
  4. Tại sao cần exec? (không có gì thực sự là được thực hiện)

Cảm ơn.

Trả lời

17

< và> thường được sử dụng để chuyển hướng IO. Nó có nghĩa là gì? Nó có thể sử dụng được trong ngữ cảnh khác không? Làm sao?

Nó giống nhau - đầu vào và đầu ra được chuyển hướng đến fd 5.

Tại sao nó hoạt động, trong khi/dev/tcp không tồn tại?

Đây là một tệp đặc biệt: Nếu máy chủ là tên máy chủ hoặc địa chỉ Internet hợp lệ và cổng là số cổng hoặc tên dịch vụ, bash cố gắng mở kết nối TCP tới ổ cắm tương ứng.

Tại sao 5? Nó có thể là một số khác không? Các giá trị được cho phép là gì?

Có, nó có thể là bất kỳ giá trị nào, nhưng bạn cần đảm bảo bạn không sử dụng fd đã được sử dụng.

Tại sao exec lại cần thiết? (không có gì thực sự được thực hiện)

exec nghĩa là chuyển hướng xảy ra trong trình bao hiện tại, không phải trong một vỏ con.

+6

Có một caveat quan trọng về câu trả lời này.Bash sẽ chỉ tôn vinh "/ dev/tcp" * nếu * hỗ trợ cho nó được kích hoạt khi bash được xây dựng. Đặc biệt, Red Hat xây dựng bash với nó được kích hoạt, trong khi Debian không (hoặc ít nhất là họ không phải là lần cuối cùng tôi kiểm tra, mà đã được lứa tuổi trước đây). Đừng mong đợi điều này để làm việc trong tất cả các vỏ, cũng không phải trong tất cả các bash. –

+0

@WilliamPursell Đồng ý! – trojanfoe

3

Tôi chỉ có thể trả lời cho phần thực hiện:

exec mà không có lệnh được cung cấp có thể được sử dụng để thay đổi chuyển hướng I/O. <> trong trường hợp này có nghĩa là mở để đọc + ghi. 5 là số kênh (hoặc bộ mô tả tập tin). Điều này có ý nghĩa nếu các lệnh khác gửi đầu ra/đọc đầu vào của chúng từ kênh 5.

Đối với "/ dev/tcp/$ {SERVER}/$ {PORT}" Tôi không biết đó có phải là một tính năng cụ thể không Phiên bản Linux hoặc nếu nó là một tính năng bash (tôi giả định sau này).

- EDIT: từ trang bash dẫn sử dụng: -

Bash handles several filenames specially when they are used 
in redirections, as described in the following table: 

     /dev/fd/fd 
      If fd is a valid integer, file descriptor fd is 
      duplicated. 
     /dev/stdin 
      File descriptor 0 is duplicated. 
     /dev/stdout 
      File descriptor 1 is duplicated. 
     /dev/stderr 
      File descriptor 2 is duplicated. 
     /dev/tcp/host/port 
      If host is a valid hostname or Internet address, 
      and port is an integer port number or service 
      name, bash attempts to open a TCP connection to 
      the corresponding socket. 
     /dev/udp/host/port 
      If host is a valid hostname or Internet address, 
      and port is an integer port number or service 
      name, bash attempts to open a UDP connection to 
      the corresponding socket. 
+5

Đây là những tiện ích mở rộng phải được bật khi biên dịch bash (--enable-net-redirections). Không phải tất cả các bản dịch Linux đều biên dịch theo cách đó. Debian và Ubuntu chẳng hạn, không kích hoạt nó. –

+0

Điểm tốt! Tôi thực sự đánh giá cao các cảnh báo về tính tương thích. – ktf

Các vấn đề liên quan