Tester si le port telnet est actif dans un script shell

10

J'essaie de créer un script pour tester s'il est possible de se connecter via telnet. Je ne veux pas vraiment me connecter; par conséquent, attendre n'est pas nécessaire. Je veux juste voir si je peux obtenir une invite de connexion. Cela se fait à partir d'un système Linux, j'ai donc essayé d'utiliser nc:

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

Le problème est que cela provoque le verrouillage de ma console. Il semble que -wla connexion ne soit pas vraiment interrompue.

J'ai également essayé d'utiliser telnet mais je ne parviens pas à rompre la connexion depuis le script. En essayant

\echo "\035" | telnet 192.168.10.5

s'interrompt avant de recevoir une invite de connexion.

rleon
la source
Copie

Réponses:

14

Bash fournit des pseudo-appareils que vous connaissez probablement comme /dev/null. Cependant, il existe d'autres périphériques tels que /dev/tcpet /dev/udppour tester les connexions réseau, que vous pouvez également utiliser dans les scripts Bash.

extrait de la page de manuel de Bash

Bash gère plusieurs noms de fichiers spécialement lorsqu'ils sont utilisés dans des redirections, comme décrit dans le tableau suivant:

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

Exemple

Ici, je teste la connexion à un hôte de mon domaine nommé skinner et je vois si je peux me connecter à son port 22.

REMARQUE: le port 22 est pour SSH, pour le port 23 d'utilisation telnet.

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

Super alors essayons 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

Eh bien, cela fonctionne, mais c'est une sortie terriblement moche. Ne pas s'inquiéter. Vous pouvez exécuter le echo > /dev/tcp/...sous-shell et rediriger toutes les sorties vers /dev/nullpour le nettoyer un peu. Voici le modèle que vous pouvez utiliser dans vos scripts 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
slm
la source
Si vous souhaitez spécifiquement tester telnet, alors cela fonctionne par défaut sur le port 23, donc là où slm a utilisé 22 et 223, utilisez 23.
Warwick
@Warwick - merci, j'ai ajouté cela comme une note dans la section des exemples.
slm
@sim merci pour le commentaire. J'ai vu ça avant mais je n'ai pas réussi à le faire fonctionner avec ça. Mon problème est que je dois pouvoir grep ou tester une invite de connexion. Dans ce cas, la console est verrouillée et il n'y a pas d'invite de connexion. # 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 me donne une invite de connexion mais je ne suis pas en mesure d'en sortir.
rleon
1
wow .. attribuer une redirection là-bas. # cat afile ^] après avoir couru, il fait juste écho à la pause afile. Je joue toujours avec mais je sens que j'y suis presque.
rleon
7

Vous êtes sur la bonne voie en utilisant nc, mais si vous voulez vraiment tester si vous pouvez établir la connexion, utilisez le -zcommutateur 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
DopeGhoti
la source
cela ne fonctionne pas sur tous les systèmes, mon nc n'a pas le drapeau -z
Shapeshifter
Intéressant. De quelle version ncs'agit-il?
DopeGhoti
Je suis sur CentOS 7, et nc a été remplacé par nmap-ncat qui n'a pas cette option :(
Shapeshifter
Si je me souviens bien, le package que vous voulez dans CentOS est tout simplement nc.
DopeGhoti
nc est nmap-ncat dans centos 7
Shapeshifter
2

Je sais que la réponse est un peu tardive, mais je cherchais comment faire et l'utilisation de nc n'était pas une option pour des raisons de sécurité, alors voici si cela peut aider quelqu'un.

Ce qui manquait dans votre écho initial était le commutateur -e:

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

Et une nouvelle ligne + la commande quit pour quitter telnet après la déconnexion. En tant que tel:

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

Évidemment, la même chose fonctionnera si vous utilisez un style de bloc if et évaluez $? comme vous l'avez fait au départ:

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

Pendant que nous y sommes, en ce qui concerne nc, cela dépend de la saveur de nc que vous avez (gnu ncat vs nmap-ncat). Gnu aura le commutateur -z:

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

tandis que l'autre ne le fera pas et vous devrez diriger une ligne vide vers votre nc pour ne pas être coincé:

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

exécuter nc -z 192.168.10.5 23dans l'invite de commande ou créer un script bash pour exécuter cette commande.

Il renvoie l'instruction ci-dessous si la connexion réussit.

Connexion au port 192.168.10.5 23 [tcp / *] réussie!

Joshua Waiswa
la source