Uji apakah port telnet aktif dalam skrip shell

10

Saya mencoba membuat skrip untuk menguji apakah mungkin masuk melalui telnet. Saya tidak ingin benar-benar masuk; oleh karena itu, mengharapkan tidak diperlukan. Saya hanya ingin melihat apakah saya bisa mendapatkan prompt login. Ini sedang dilakukan dari sistem Linux jadi saya telah mencoba menggunakan nc:

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

Masalahnya adalah ini menyebabkan konsol saya terkunci. Sepertinya -wtidak benar-benar menjatuhkan koneksi.

Saya juga mencoba menggunakan telnet tetapi saya tidak dapat memutuskan koneksi dari dalam skrip. Mencoba

\echo "\035" | telnet 192.168.10.5

istirahat sebelum saya mendapatkan prompt login.

Ronle
sumber
Kemungkinan duplikat dari superuser.com/questions/621870/…
vschum

Jawaban:

14

Bash menyediakan perangkat pseudo yang mungkin Anda kenal seperti /dev/null. Namun ada perangkat lain seperti /dev/tcpdan /dev/udpuntuk menguji koneksi jaringan, yang dapat Anda gunakan dari dalam skrip Bash juga.

kutipan dari halaman manual Bash

Bash menangani beberapa nama file secara khusus ketika mereka digunakan dalam pengalihan, seperti yang dijelaskan dalam tabel berikut:

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

Contoh

Inilah saya sedang menguji koneksi ke host di domain saya bernama skinner dan melihat apakah saya dapat terhubung ke port 22.

CATATAN: Port 22 untuk SSH, untuk telnet gunakan port 23.

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

Hebat jadi mari kita coba non-port:

$ 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

Yah itu bekerja, tapi itu output yang sangat jelek. Tidak perlu khawatir. Anda dapat menjalankan echo > /dev/tcp/...dalam subkulit dan mengarahkan semua output /dev/nulluntuk membersihkannya sedikit. Inilah pola yang dapat Anda gunakan dalam skrip shell Anda:

$ (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
slm
sumber
Jika Anda secara khusus ingin menguji telnet, maka itu secara default berjalan pada port 23, jadi di mana slm telah menggunakan 22 dan 223, gunakan 23.
Warwick
@ Warwick - terima kasih, saya telah menambahkan itu sebagai catatan di bagian contoh.
slm
@sim, terima kasih atas komentarnya. Saya melihat ini sebelumnya tetapi saya tidak bisa membuatnya bekerja dengan ini. Masalah saya adalah bahwa saya harus dapat melakukan grep atau menguji prompt login. Dalam hal ini konsol terkunci dan tidak ada prompt masuk. # 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 memberi saya prompt masuk tetapi saya tidak dapat keluar darinya.
rleon
1
wow .. banyak pengalihan di sana. # cat afile ^] setelah menjalankan itu hanya menggemakan istirahat untuk afile. Masih bermain dengan itu tetapi saya merasa saya hampir sampai.
rleon
7

Anda berada di jalur yang benar menggunakan nc, tetapi jika Anda benar-benar ingin menguji apakah Anda dapat membuat koneksi, gunakan sakelar 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
DopeGhoti
sumber
ini tidak bekerja pada semua sistem, nc saya tidak memiliki flag -z
Shapeshifter
Menarik. Versi ncapa ini?
DopeGhoti
Saya menggunakan CentOS 7, dan nc diganti dengan nmap-ncat yang tidak memiliki opsi itu :(
Shapeshifter
Jika saya ingat dengan benar, paket yang Anda inginkan di CentOS sederhana nc.
DopeGhoti
nc adalah nmap-ncat di centos 7
Shapeshifter
2

Saya tahu jawabannya agak terlambat, tapi saya mencari cara untuk melakukan ini dan menggunakan nc bukan pilihan untuk alasan keamanan, jadi ini dia jika dapat membantu seseorang.

Apa yang hilang dalam gema awal Anda adalah -e switch:

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

Dan baris baru + perintah berhenti untuk berhenti dari telnet setelah memutuskan hubungan. Dengan demikian:

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

Jelas hal yang sama akan bekerja jika Anda menggunakan gaya blok jika pernyataan dan mengevaluasi $? seperti yang Anda lakukan pada awalnya:

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

Sementara kita berada di dalamnya, sejauh nc pergi, itu tergantung pada apa rasa nc yang Anda miliki (gnu ncat vs nmap-ncat). Gnu akan memiliki tombol -z:

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

sementara yang lain tidak mau dan Anda harus menyalurkan saluran kosong ke nc Anda agar tidak terjebak:

echo | nc 10.0.0.1 23
# (evaluate $? here)
Alex B
sumber
1

jalankan nc -z 192.168.10.5 23di command prompt atau buat skrip bash untuk menjalankan perintah ini.

Ini mengembalikan pernyataan di bawah ini jika koneksi berhasil.

Koneksi ke 192.168.10.5 23 port [tcp / *] berhasil!

Joshua Waiswa
sumber