Test du port TCP distant à l'aide de telnet en exécutant une commande sur une ligne

12

J'ai de nombreuses boîtes Linux avec un ensemble très limité de commandes et d'espace disque. Mais il a la telnetcommande dessus.

Je me connecte à distance à chacune de ces sondes (par programme) et émets une commande linux en ligne via SSH.

Je dois exécuter une seule commande pour me connecter à une machine spécifique, en utilisant telnet, puis me déconnecter immédiatement .

Je peux faire tout ça, mais la déconnexion part tout de suite . Telnet ouvre une sorte de console ou de terminal et je n'arrive pas à trouver une commande sur une ligne pour exécuter la commande telnet, puis se déconnecter immédiatement.

Si je fais cela, je peux facilement analyser la sortie textuelle des messages d'erreur pour ne pas pouvoir me connecter à la machine sur le port spécifié et c'est exactement ce que je recherche.

Alors, comment puis-je exécuter une commande sur une ligne pour me connecter à une machine en utilisant Telnet et me déconnecter ensuite?

Muhammad Gelbana
la source
Si je comprends bien, votre client Telnet ne prend pas en charge l'envoi direct?
IBr
@IBr, que voulez-vous dire?
Muhammad Gelbana
Notez que les clients telent diffèrent dans le code de sortie signalé après que la commande de sortie côté client est utilisée pour le terminer. Le code de sortie zéro ne doit donc pas être considéré comme un signal d'ouverture du port. Ne fonctionne pas pour RHEL telent RPM au moins.
Oliver Gondža du

Réponses:

28

Vous devriez pouvoir exitdiriger la commande dans STDIN dans telnet. Essayer:

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

et voyez si cela fonctionne. (il semble fonctionner sur mon serveur web, mais YMMV).

Charles Newey
la source
pourrait fonctionner mais semble stupide - telnet devrait avoir une option pour quitter ou quelque chose au premier contact
Alexander Mills
10

La méthode la plus simple et la plus simple est donnée ci-dessous.

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

n - Le temps d'attente en secondes avant la sortie automatique. Il pourrait être fractionné comme 0,5. Notez que certaines sorties requises peuvent ne pas être renvoyées dans le temps d'attente spécifié. Il nous faudra donc peut-être augmenter en conséquence.

serveur - L'adresse IP ou le nom d'hôte du serveur cible.

port - Numéro de port de service cible.

Vous pouvez également rediriger la sortie vers un fichier comme celui-ci,

sleep 1 | telnet <server> <port> > output.log
Seff
la source
Cela fonctionne parfaitement! Alors que la sortie est en effet redirigée, j'ai remarqué que je reçois toujours la "Connexion fermée par un hôte étranger". sortie dans ma console après le sommeil plutôt que dans le fichier output.log. Une façon d'empêcher cela?
dan
5

Dans mon cas, cela fonctionne. (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
Chuss
la source
1
Hé, c'est super. Je suis un utilisateur sur tous les systèmes Linux de mon travail, mais pas l'administrateur (et je n'ai aucun droit d'administrateur). J'en ai marre de leur demander d'installer telnet tout le temps pour pouvoir tester la connectivité réseau (je suis ingénieur réseau). Il s'agit d'une excellente solution de contournement. Je l'ai un peu changé pour jouer plus comme telnet. J'ai fourni ma propre réponse ici avec les modifications.
theglossy1
3

Je pense que le meilleur outil pour envoyer des commandes directement et obtenir simplement la sortie serait netcat. C'est un outil simple mais puissant pour passer des commandes via les ports. Vous pouvez voir un exemple d'utilisation dans cette question de superutilisateur: /superuser/261900/how-can-i-pipe-commands-to-a-netcat-that-will-stay-alive - le demandeur donne un exemple de travail dans lequel la connexion se ferme après quelques secondes.

Et si vous voulez simplement tester la connectivité, utilisez ceci: http://terminalinflection.com/use-netcat-not-telnet-to-test-network-connectivity/

IBr
la source
J'essaie d'installer netcat en ce moment mais je ne peux pas le faire. J'ai téléchargé une version powerpc compilée mais la bibliothèque glibc était manquante. J'ai téléchargé une version compilée de powerpc mais l'appareil n'avait pas assez d'espace pour copier les fichiers de la bibliothèque! Est-il possible que la bibliothèque glibc existe déjà mais que netcat ne la trouve pas?
Muhammad Gelbana
Netcat n'est nécessaire que du côté client: sur le serveur (sonde) peut être le même vieux telnet simple.
IBr
De plus, Glibc devrait déjà exister, il est utilisé sur beaucoup de choses dans le système habituel.
IBr
Vous pouvez essayer d'ajouter aux scripts telnet pour && exitvoir s'il se déconnecte (en ssh au moins c'est suffisant).
IBr
&& exitn'a pas fonctionné. Si la glibc devait exister et je pense que oui. Pourquoi s'en nc.traditionalplaindrait comme s'il manquait?
Muhammad Gelbana
1

Ceci est une autre version de la réponse ci - dessus qui la fait agir un peu plus comme la syntaxe telnet "normale". Si vous aimez ma réponse, veuillez donner une note positive non pas à cela, mais à l'original.

#!/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
theglossy1
la source
1

Voici la solution que j'ai trouvée sur 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

Cela fonctionne pour moi sur SunOS et HP-UX

Vladimir
la source
0

Essayer

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

La meilleure partie de ce qui précède est que vous obtenez également le statut de sortie. Si telnet est réussi, le code de sortie sera 0 ou bien son 1

Abhishek Kumar
la source
0

Évitez netcat si vous avez des itinéraires personnalisés, car il n'obéit pas aux règles de routage. Similaire à la façon nslookupdont dig& hostignorer le fichier / etc / hosts ( nslookup, dig, firefox ignorant les entrées du fichier / etc / hosts ).

c'est-à-dire: contrairement aux applications et aux outils tels que telnetet /dev/tcp( Test du port TCP distant à l'aide de telnet en exécutant une commande à une ligne ) qui suivent les règles de routage du système, ncutilise la passerelle par défaut, sauf indication contraire d'utiliser une adresse IP source avec -s:

nc -w 3 -s 192.168.1.12 example.com 8080

J'avais besoin de tester si une application pouvait atteindre la ressource, et si les routes étaient en panne, j'ai netcatsignalé que tout allait bien puisque l'adresse source avait été spécifiée dans le test. Je passe à l'utilisation /dev/tcp.

legatoproteus
la source