Kiểm tra cổng TCP từ xa bằng telnet bằng cách chạy lệnh một dòng


12

Tôi có nhiều hộp linux với một bộ lệnh và dung lượng đĩa rất hạn chế. Nhưng nó có telnetlệnh trên đó.

Tôi kết nối từ xa với từng đầu dò này (theo chương trình) và đưa ra lệnh linux một dòng thông qua SSH.

Tôi cần chạy một lệnh duy nhất để kết nối với một máy cụ thể, sử dụng telnet và sau đó ngắt kết nối ngay lập tức .

Tôi có thể làm tất cả điều đó, nhưng phần ngắt kết nối ngay lập tức . Telnet mở một số loại bàn điều khiển hoặc thiết bị đầu cuối và tôi không thể tìm ra lệnh một dòng để chạy lệnh telnet và sau đó ngắt kết nối ngay lập tức.

Nếu tôi làm điều đó, tôi có thể dễ dàng phân tích đầu ra văn bản cho các thông báo lỗi vì không thể kết nối với máy trên cổng được chỉ định và đó chính xác là những gì tôi đang tìm kiếm.

Vậy làm thế nào tôi có thể chạy lệnh một dòng để kết nối với máy bằng telnet và ngắt kết nối sau đó?


Theo tôi hiểu, máy khách Telnet của bạn không hỗ trợ gửi trực tiếp?
IBr

@IBr, ý bạn là gì?
Muhammad Gelbana

Lưu ý rằng các máy khách telent khác nhau trong mã thoát được báo cáo sau khi lệnh thoát phía máy khách được sử dụng để chấm dứt nó. Vì vậy, mã thoát không nên được coi là tín hiệu cổng được mở. Không hoạt động cho RPEL telent RPM ít nhất.
Oliver Gondža

Câu trả lời:


28

Bạn nên có thể chuyển exitlệnh vào STDIN telnet. Thử:

echo 'exit' | telnet {site} {port}

và xem nếu nó hoạt động. (có vẻ như nó hoạt động trên máy chủ web của tôi, nhưng YMMV).


có thể hoạt động nhưng có vẻ ngu ngốc - telnet nên có một tùy chọn để thoát hoặc một cái gì đó trong lần tiếp xúc đầu tiên
Alexander Mills

10

Phương pháp đơn giản và dễ dàng nhất được đưa ra dưới đây.

 sleep <n> | telnet <server> <port>

n - Thời gian chờ tính bằng giây trước khi tự động thoát. Nó có thể là phân số như 0,5. Lưu ý rằng một số đầu ra cần thiết có thể không được trả lại trong thời gian chờ được chỉ định. Vì vậy, chúng ta có thể cần phải tăng cho phù hợp.

máy chủ - IP máy chủ đích hoặc tên máy chủ.

cổng - Số cổng dịch vụ mục tiêu.

Bạn cũng có thể chuyển hướng đầu ra thành tập tin như thế này,

sleep 1 | telnet <server> <port> > output.log

Điều này hoạt động hoàn hảo! Trong khi đầu ra thực sự được chuyển hướng, tôi nhận thấy tôi vẫn nhận được "Kết nối được đóng bởi máy chủ nước ngoài." đầu ra trong bảng điều khiển của tôi sau khi ngủ chứ không phải trong tệp output.log. Có cách nào để ngăn chặn điều này?
dnLL

5

Trong trường hợp của tôi điều này làm việc. (CentOS 7):

while read host port; do
r=$(bash -c 'exec 3<> /dev/tcp/'$host'/'$port';echo $?' 2>/dev/null)
if [ "$r" = "0" ]; then
     echo "$host $port is open"
else
     echo "$host $port is closed"
     exit 1 # To force fail result in ShellScript
fi
done

1
Này, điều này thật tuyệt. Tôi là người dùng trên tất cả các hệ thống Linux trong công việc của mình, nhưng không phải là quản trị viên (và không có quyền quản trị). Tôi phát ốm khi yêu cầu họ cài đặt telnet mọi lúc để tôi có thể kiểm tra kết nối mạng (Tôi là kỹ sư mạng). Đây là một cách giải quyết tuyệt vời. Tôi đã thay đổi nó một chút để thực hiện giống như telnet. Tôi đã cung cấp câu trả lời của riêng tôi ở đây với các sửa đổi.
theglossy1

3

Tôi nghĩ rằng công cụ tốt hơn để gửi lệnh trực tiếp và chỉ nhận được đầu ra sẽ là netcat. Nó chỉ là công cụ đơn giản nhưng mạnh mẽ để đưa lệnh qua các cổng. Bạn có thể xem ví dụ sử dụng trong câu hỏi siêu người dùng này: /superuser/261900/how-can-i-pipe-commands-to-a-netcat-that-will-stay-alive - người hỏi đưa ra ví dụ làm việc trong đó kết nối sẽ đóng lại sau vài giây.

Và nếu bạn muốn kiểm tra kết nối, hãy sử dụng: http://terminalinflection.com/use-netcat-not-telnet-to-test-network-connectivity/


Tôi đang cố gắng cài đặt netcat ngay bây giờ nhưng tôi không thể làm như vậy. Tôi đã tải xuống một phiên bản powerpc đã biên dịch nhưng thư viện glibc bị thiếu. Tôi đã tải xuống phiên bản powerpc đã biên dịch nhưng thiết bị không có đủ dung lượng để sao chép các tệp thư viện! Có thể là thư viện glibc đã tồn tại nhưng netcat không thể tìm thấy nó?
Muhammad Gelbana

Netcat chỉ cần thiết ở phía máy khách: trên máy chủ (đầu dò) có thể là cùng một telnet cũ.
IBr

Ngoài ra Glibc nên tồn tại, nó được sử dụng trên nhiều thứ trong hệ thống thông thường.
IBr

Bạn có thể thử thêm vào các tập lệnh telnet && exitxem nó có ngắt kết nối không (trong ssh ít nhất là đủ).
IBr

&& exitđã không làm việc. Nếu glibc nên tồn tại và tôi tin là có. Tại sao sẽ nc.traditionalphàn nàn về nó như thể nó thiếu?
Muhammad Gelbana

1

Đây là một phiên bản khác của câu trả lời ở trên khiến nó hoạt động giống như cú pháp telnet "bình thường" hơn một chút. Nếu bạn thích câu trả lời của tôi, xin vui lòng đưa ra một upvote không phải cho điều này, mà cho bản gốc.

#!/bin/bash
if [ "$2" == "" ]; then
 echo "Syntax: $0 <host> <port>"
 exit;
fi

host=$1
port=$2

r=$(bash -c 'exec 3<> /dev/tcp/'$host'/'$port';echo $?' 2>/dev/null)
if [ "$r" = "0" ]; then
     echo "$host $port is open"
else
     echo "$host $port is closed"
     exit 1 # To force fail result in ShellScript
fi

1

Đây là giải pháp tôi tìm thấy trên Internet:

( echo open 127.0.0.1 23
sleep 5
echo your_login
sleep 5
echo your_password
sleep 5
echo hostname
sleep 5
echo exit ) | telnet

Nó hoạt động với tôi trên SunOS & HP-UX


0

Thử

echo -e '\x1dclose\x0d' | telnet {HOSTNAME} {PORT}

Phần tốt nhất ở trên là bạn cũng có được trạng thái thoát. Nếu telnet là mã thoát thành công sẽ là 0 hoặc nếu không thì 1


0

Tránh netcat nếu bạn có các tuyến tùy chỉnh, vì nó không tuân theo các quy tắc định tuyến. Tương tự như cách nslookup, dighostbỏ qua tệp / etc / hosts ( nslookup, dig, firefox bỏ qua / etc / hosts tệp mục ).

tức là: không giống như các ứng dụng và công cụ như telnet/dev/tcp( Kiểm tra cổng TCP từ xa bằng telnet bằng cách chạy lệnh một dòng ) tuân theo quy tắc định tuyến của hệ thống, ncsử dụng cổng mặc định trừ khi được yêu cầu sử dụng địa chỉ IP nguồn với -s:

nc -w 3 -s 192.168.1.12 example.com 8080

Tôi cần kiểm tra xem một ứng dụng có thể tiếp cận tài nguyên hay không và nếu các tuyến đường bị hỏng, netcatđã báo cáo rằng tất cả đều ổn vì địa chỉ nguồn đã được chỉ định trong thử nghiệm. Tôi đang chuyển sang sử dụng /dev/tcp.

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.