/ dev / tcp lắng nghe thay vì nc nghe


39

Với một người nghe netcat như:

nc -l <port> < ~/.bashrc

Tôi có thể lấy .bashrc của mình trên một máy mới (không có nchoặc LDAP) với:

cat < /dev/tcp/<ip>/<port> > ~/.bashrc

Câu hỏi của tôi là: Có cách nào bắt chước các khả năng của nc -l <port>dòng đầu tiên của tôi với / dev / tcp thay vì nckhông?

Các máy tôi đang làm việc là môi trường phòng thí nghiệm / hộp cát cực kỳ cứng nhắc RHEL (không ssh, không nc, không LDAP, không yum, tôi không thể cài đặt phần mềm mới và chúng không được kết nối với internet)


Viết một kịch bản python để giữ cho ổ cắm mở có cách nào dễ dàng để thực hiện việc này không?
h3rrmiller

Câu trả lời:


23

Nếu Perl được cài đặt (vì nó sẽ nằm trên máy RHEL):

perl -MIO::Socket::INET -ne 'BEGIN{$l=IO::Socket::INET->new(
  LocalPort=>1234,Proto=>"tcp",Listen=>5,ReuseAddr=>1);
  $l=$l->accept}print $l $_' < ~/.bashrc

sẽ hoạt động, trừ khi tường lửa cục bộ không cho phép kết nối đến 1234.

Nếu socat được cài đặt:

socat -u - tcp-listen:1234,reuseaddr < ~/.bashrc

Nếu zsh được cài đặt:

zmodload zsh/net/tcp
ztcp -ld3 1234 && # start listening socket on fd 3
  ztcp -ad4 3 && # accept connection on fd 4
  ztcp -c 3 && # close the listening socket that is no longer needed
  cat < ~/.bashrc >&4 && # send the data
  ztcp -c 4 # close the communication socket to tell the other end we're finished

Không nên ztcp -c 4lệnh cuối cùng đọc 3? Nếu không thông tin tuyệt vời, mẹo tuyệt vời.
dezza

@dezza, xem chỉnh sửa. Ổ cắm trên fd 3 thực sự không được đóng (mặc dù nó sẽ là khi tập lệnh kết thúc). Chúng ta cần đóng ổ cắm trên fd 4 để đầu kia có EOF.
Stéphane Chazelas

42

Thật không may, không thể làm gì chỉ với bash. /dev/tcp/<ip>/<port>các tệp ảo được triển khai theo cách mà bash cố gắng kết nối với hàm được chỉ định <ip>:<port>bằng cách sử dụng connect(2). Để tạo ổ cắm nghe, nó sẽ phải gọi bind(2)chức năng.

Bạn có thể kiểm tra điều này bằng cách tải xuống bashcác nguồn và nhìn vào nó. Nó được triển khai trong lib/sh/netopen.ctệp trong _netopen4chức năng (hoặc _netopen6, cũng hỗ trợ IPv6). Hàm này được sử dụng bởi hàm bao bọc netopentừ cùng một tệp, lần lượt được sử dụng trực tiếp trong tệp redir.c( redir_special_openhàm) để thực hiện chuyển hướng ảo này.

Bạn phải tìm một số ứng dụng khác có thể tạo ổ cắm nghe trên máy của bạn.


+1 bash cho phép tạo ổ cắm máy khách nhưng ổ cắm máy chủ bạn có thể sử dụng nc hoặc có thể được thực hiện bằng perl hoặc c, trên thực tế quy trình máy chủ sẽ lặp lại chấp nhận các kết nối và sinh sản hoặc tạo ra các luồng hoặc nó chỉ có thể chấp nhận một kết nối
Nahuel Fouilleul

2
@NahuelFouilleul: Điều đó không hoàn toàn chính xác. Bạn có thể xử lý nhiều máy khách chỉ bằng một luồng / tiến trình bằng cách sử dụng cái gọi là lập trình mạng "không đồng bộ" hoặc "điều khiển sự kiện" (thử googling cho hàm select () và cách sử dụng nó trong lập trình mạng). Trong nhiều trường hợp, đó là cách tốt hơn (nhanh hơn) để chấp nhận nhiều khách hàng.
Krzysztof Adamski

Cảm ơn tôi đã không mặc dù giải pháp này
Nahuel Fouilleul

4
Đây là những gì xinetd dành cho. Nó thực hiện việc nghe và sinh ra quá trình / tập lệnh tùy ý của bạn cho bất kỳ kết nối đến nào. Với nó, bất cứ điều gì cũng có thể trở thành một máy chủ TCP / IP.
Evi1M4chine

0

Không có cách nào để lắng nghe vì lắng nghe không phải là bash như Adamski đã chỉ ra.

Nhưng bạn không cần lắng nghe khách hàng, vì vậy bạn không cần netcat trên máy khách để truyền tệp, ví dụ:

## To send a file to the locked down computer: 
 ## Local server where you do have netcat 
cat ~/.bashrc | nc -l -q 1 -p 8998

 ## Remote locked down computer without netcat
cat < /dev/tcp/local.server.ip.addr/8998 > latest.bashrc 

## To grab a file from the locked down computer: 
 ## First - on the local server run 
nc -l -p 8998 -q 1 > remote.bashrc < /dev/null 

 ## Then on the locked down computer run: 
cat ~/.bashrc > /dev/tcp/local.server.ip.addr/8998 0<&1 2>&1

-3

bạn có thể làm điều đó như bạn đã nói, hỏi / dev / tcp, với bash:

</dev/tcp/host/port

nếu nó chạy ngay lập tức, nó sẽ lắng nghe


4
Không. Bạn chắc chắn đã không kiểm tra điều này và nếu bạn đã không hiểu kết quả. Đề xuất của bạn sẽ mở ổ cắm (không nghe) và chuyển hướng vào bất kỳ lệnh nào bạn đã chạy. Một câu trả lời đúng đã được tìm thấy (gần 6 năm trước ...) vì vậy tôi không chắc tại sao bạn lại chọn câu hỏi này.
h3rrmiller
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.