Verifica se la porta telnet è attiva all'interno di uno script shell


10

Sto cercando di creare uno script per verificare se è possibile accedere tramite telnet. Non desidero davvero accedere; pertanto, aspettarsi non è necessario. Voglio solo vedere se sono in grado di ottenere un prompt di accesso. Questo viene fatto da un sistema Linux, quindi ho cercato di usare nc:

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

Il problema è che questo sta causando il blocco della mia console. Sembra che -wnon stia davvero abbandonando la connessione.

Ho anche provato a utilizzare telnet ma non riesco a interrompere la connessione all'interno dello script. Provando

\echo "\035" | telnet 192.168.10.5

si interrompe prima di ricevere una richiesta di accesso.


Possibile duplicato di superuser.com/questions/621870/…
vschum

Risposte:


14

Bash fornisce pseudo dispositivi con cui probabilmente hai familiarità /dev/null. Tuttavia ci sono altri dispositivi come /dev/tcpe /dev/udpper testare le connessioni di rete, che puoi usare anche all'interno degli script Bash.

estratto dalla pagina man di Bash

Bash gestisce diversi nomi di file specialmente quando vengono utilizzati nei reindirizzamenti, come descritto nella tabella seguente:

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

Esempio

Qui sto testando la connessione a un host nel mio dominio chiamato skinner e vedo se riesco a connettermi alla sua porta 22.

NOTA: la porta 22 è per SSH, per telnet utilizzare la porta 23.

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

Ottimo quindi proviamo un 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

Bene, funziona, ma è un risultato terribilmente brutto. Da non preoccuparsi. È possibile eseguire echo > /dev/tcp/...in una subshell e reindirizzare tutto l'output /dev/nullper pulirlo un po '. Ecco lo schema che puoi usare nei tuoi script di shell:

$ (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

Se si desidera specificamente testare telnet, che per impostazione predefinita viene eseguito sulla porta 23, quindi dove slm ha utilizzato 22 e 223, utilizzare 23.
Warwick

@Warwick - grazie, l'ho aggiunto come nota nella sezione degli esempi.
slm

@sim grazie per il commento. L'ho visto prima, ma non sono riuscito a farlo funzionare. Il mio problema è che devo essere in grado di grep o testare un prompt di accesso. In questo caso la console è bloccata e non è richiesto alcun prompt di accesso. # 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 mi dà un prompt di accesso ma non riesco a evitarlo.
Rleon,

1
wow .. un sacco di reindirizzamento lì. # cat afile ^] dopo aver eseguito che sta solo facendo eco alla pausa afile. Ci sto ancora giocando ma mi sento quasi arrivato.
Rleon,

7

Stai usando la strada giusta nc, ma se vuoi davvero testare se puoi stabilire la connessione, usa l' -zinterruttore nc :

#!/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

questo non funziona su tutti i sistemi, il mio nc non ha il flag -z
Shapeshifter,

Interessante. Di quale versione ncè?
DopeGhoti,

Sono su CentOS 7 e nc è stato sostituito con nmap-ncat che non ha questa opzione :(
Shapeshifter,

Se ricordo bene, il pacchetto desiderato in CentOS è semplicemente nc.
DopeGhoti,

nc è nmap-ncat in centos 7
Shapeshifter,

2

So che la risposta è un po 'in ritardo, ma stavo cercando come farlo e usare nc non era un'opzione per motivi di sicurezza, quindi ecco se può aiutare qualcuno.

Ciò che mancava nell'eco iniziale era l'opzione -e:

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

E una nuova riga + il comando quit per uscire da telnet dopo la disconnessione. Come tale:

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

Ovviamente lo stesso funzionerà se usi uno stile di blocco se istruzione e valuta $? come hai fatto inizialmente:

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

Mentre ci siamo, per quanto riguarda nc, dipende da quale sapore di nc hai (gnu ncat vs nmap-ncat). Gnu avrà l'opzione -z:

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

mentre l'altro no e dovrai collegare una linea vuota al tuo nc per non rimanere bloccato:

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

1

eseguire nc -z 192.168.10.5 23nel prompt dei comandi o creare uno script bash per eseguire questo comando.

Restituisce la seguente dichiarazione se la connessione ha esito positivo.

Connessione alla porta 192.168.10.5 23 [tcp / *] riuscita!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.