Kiểm tra xem cổng telnet có hoạt động trong tập lệnh shell không


10

Tôi đang cố gắng tạo một kịch bản để kiểm tra xem có thể đăng nhập qua telnet hay không. Tôi không muốn thực sự đăng nhập; do đó, mong đợi là không cần thiết. Tôi chỉ muốn xem nếu tôi có thể nhận được một dấu nhắc đăng nhập. Điều này đang được thực hiện từ một hệ thống Linux nên tôi đã cố gắng sử dụng nc:

nc 192.168.10.5 23 -w 1 | grep -q login 
if [ $? -eq 1 ]
then
    echo "console is down"
fi

Vấn đề là điều này khiến bảng điều khiển của tôi bị khóa. Có vẻ như -wkhông thực sự giảm kết nối.

Tôi cũng đã thử sử dụng telnet nhưng tôi không thể ngắt kết nối từ trong tập lệnh. Cố gắng

\echo "\035" | telnet 192.168.10.5

nghỉ trước khi tôi nhận được một dấu nhắc đăng nhập.


Bản sao có thể có của superuser.com/questions/621870/
Mạnh

Câu trả lời:


14

Bash cung cấp các thiết bị giả mà bạn có thể quen thuộc như /dev/null. Tuy nhiên, có những thiết bị khác như /dev/tcp/dev/udpđể kiểm tra các kết nối mạng mà bạn cũng có thể sử dụng từ trong các tập lệnh Bash.

đoạn trích từ trang của Bash

Bash xử lý một số tên tệp đặc biệt khi chúng được sử dụng trong các chuyển hướng, như được mô tả trong bảng sau:

          /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.

Thí dụ

Đây là tôi đang kiểm tra kết nối đến một máy chủ lưu trữ trong miền của tôi có tên skinner và xem liệu tôi có thể kết nối với cổng 22 không.

LƯU Ý: Cổng 22 dành cho SSH, cho telnet sử dụng cổng 23.

$ echo > /dev/tcp/skinner/22 && echo "it's up" || echo "it's down"
it's up

Tuyệt vời vì vậy hãy thử một cổng không:

$ echo > /dev/tcp/skinner/223 && echo "it's up" || echo "it's down"
bash: connect: Connection refused
bash: /dev/tcp/skinner/223: Connection refused
it's down

Vâng, nó hoạt động, nhưng đó là đầu ra cực kỳ xấu xí. Không phải lo lắng. Bạn có thể chạy echo > /dev/tcp/...trong một mạng con và chuyển hướng tất cả đầu ra /dev/nullđể dọn sạch nó một chút. Đây là mẫu bạn có thể sử dụng trong tập lệnh shell của mình:

$ (echo > /dev/tcp/skinner/22) > /dev/null 2>&1 \
    && echo "it's up" || echo "it's down"
it's up

$ (echo > /dev/tcp/skinner/223) > /dev/null 2>&1 \
    && echo "it's up" || echo "it's down"
it's down

Nếu bạn đặc biệt muốn kiểm tra telnet, thì theo mặc định, nó chạy trên cổng 23, vì vậy slm đã sử dụng 22 và 223, hãy sử dụng 23.
Warwick

@Warwick - cảm ơn, tôi đã thêm nó như một ghi chú trong phần ví dụ.
slm

@sim cảm ơn đã bình luận. Tôi đã thấy điều này trước đây nhưng tôi không thể làm cho nó hoạt động với nó. Vấn đề của tôi là tôi cần có thể grep hoặc kiểm tra lời nhắc đăng nhập. Trong trường hợp này, bàn điều khiển bị khóa và không có dấu nhắc đăng nhập. # telnet 192.168.10.5 Trying 192.168.10.5... Connected to 192.168.10.5 (192.168.10.5). Escape character is '^]'. Connection closed by foreign host.
rleon

# cat < /dev/tcp/192.168.10.12/23 cung cấp cho tôi một dấu nhắc đăng nhập nhưng tôi không thể thoát ra khỏi nó.
rleon

1
wow .. phân bổ chuyển hướng ở đó. # cat afile ^] sau khi chạy nó chỉ là lặp lại giữa hai hiệp để afile. Vẫn chơi với nó nhưng tôi cảm thấy mình gần như ở đó.
rleon

7

Bạn đang đi đúng hướng bằng cách sử dụng nc, nhưng nếu bạn thực sự muốn kiểm tra xem bạn có thể thiết lập kết nối hay không, hãy sử dụng công tắc của nc-z :

#!/bin/bash
REMOTEHOST=10.11.12.13
REMOTEPORT=1234
TIMEOUT=1

if nc -w $TIMEOUT -z $REMOTEHOST $REMOTEPORT; then
    echo "I was able to connect to ${REMOTEHOST}:${REMOTEPORT}"
else
    echo "Connection to ${REMOTEHOST}:${REMOTEPORT} failed. Exit code from Netcat was ($?)."
fi

Điều này không hoạt động trên tất cả các hệ thống, nc của tôi không có cờ -z
Shapeshifter

Hấp dẫn. Phiên bản ncnày là gì?
DopeGhoti

Tôi đang sử dụng CentOS 7 và nc đã được thay thế bằng nmap-ncat không có tùy chọn đó :(
Shapeshifter

Nếu tôi nhớ lại một cách chính xác, gói bạn muốn trong CentOS chỉ đơn giản là nc.
DopeGhoti

nc là nmap-ncat trong centos 7
Shapeshifter

2

Tôi biết câu trả lời là hơi muộn, nhưng tôi đang tìm cách làm điều này và sử dụng nc không phải là một lựa chọn vì lý do bảo mật, vì vậy đây là nếu nó có thể giúp đỡ ai đó.

Điều còn thiếu trong tiếng vang ban đầu của bạn là công tắc -e:

   -e     enable interpretation of backslash escapes
   -E     disable interpretation of backslash escapes (default)

Và một dòng mới + lệnh thoát để thoát telnet sau khi ngắt kết nối. Như vậy:

echo -e '\035\nquit' | telnet 10.0.0.1 23 && echo "success" || echo "failed"

Rõ ràng điều tương tự sẽ hoạt động nếu bạn sử dụng kiểu khối nếu câu lệnh và đánh giá $? như bạn đã làm ban đầu:

echo -e '\035\nquit' | telnet 10.0.0.1 23
if [ $? -eq 1 ]
then
  echo "Console is down."
fi

Trong khi chúng ta đang ở đó, theo như nc, nó phụ thuộc vào hương vị của nc bạn có (gnu ncat vs nmap-ncat). Gnu sẽ có công tắc -z:

  -z                         Zero-I/O mode, report connection status only
nc -z 10.0.0.1 23
# (evaluate $? here)

trong khi những người khác sẽ không và bạn sẽ phải chuyển một dòng trống đến nc của bạn để không bị mắc kẹt:

echo | nc 10.0.0.1 23
# (evaluate $? here)

1

chạy nc -z 192.168.10.5 23trong dấu nhắc lệnh hoặc tạo tập lệnh bash để chạy lệnh này.

Nó trả về câu lệnh dưới đây nếu kết nối thành công.

Kết nối với cổng 192.168.10.5 23 [tcp / *] đã thành công!

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.