93 votes

Automatiser une session telnet à l'aide de scripts bash

Je travaille sur l'automatisation de certaines telnet à l'aide de scripts Bash. Une fois automatisé, il n'y aura plus aucune interaction de l'utilisateur avec telnet (c'est-à-dire qu'il sera totalement automatisé)

Les scripts ressemblent à ceci :

# execute some commands on the local system
# access a remote system with an IP address: 10.1.1.1 (for example)

telnet 10.1.1.1

# execute some commands on the remote system
# log all the activity (in a file) on the Local system
# exit telnet
# continue on with executing the rest of the script.

Je suis confronté à deux problèmes :

  1. Comment exécuter les commandes sur le système distant à partir du script (sans interaction humaine) ?

    D'après mon expérience avec certains codes de test, j'ai pu déduire que lorsque l'option telnet 10.1.1.1 est exécuté, telnet passe en session interactive et les lignes de code suivantes dans le script sont exécutées sur le système local. Comment puis-je exécuter les lignes de code sur le système distant plutôt que sur le système local ?

  2. Je ne parviens pas à obtenir un fichier journal pour l'activité dans le système d'information de l'entreprise. telnet sur le système local. La redirection stdout que j'ai utilisée fait une copie sur le système distant (je ne veux pas effectuer une opération de copie pour copier le journal sur le système local). Comment puis-je réaliser cette fonctionnalité ?

114voto

thiton Points 21303

Bien que je suggère d'utiliser expect De même, pour une utilisation non-interactive, les commandes normales du shell peuvent suffire. telnet accepte sa commande sur stdin, il suffit donc de passer ou d'écrire les commandes dans le tube par le biais de heredoc :

telnet 10.1.1.1 <<EOF
remotecommand 1
remotecommand 2
EOF

(Edit : D'après les commentaires, la commande à distance a besoin d'un certain temps pour traiter les entrées ou le début de la commande. SIGHUP n'est pas pris en charge de manière gracieuse par telnet . Dans ces cas, vous pouvez essayer de dormir un peu sur l'entrée :)

{ echo "remotecommand 1"; echo "remotecommand 2"; sleep 1; } | telnet 10.1.1.1

En tout cas, s'il devient interactif ou autre, utilisez expect .

3 votes

+1 sleep fonctionne comme un rêve ;-) J'ai également ajouté | tee /dev/tty | entre les deux pour avoir une session complète sur l'écran ;-)

1 votes

Dans mon cas, la réponse la plus utile, mais j'ai dû rajouter echo -e "command\r";

1 votes

Comment fournir un mot de passe pour un telnet non interactif ?

96voto

joemooney Points 487

Rédiger un expect script.

Voici un exemple :

#!/usr/bin/expect

#If it all goes pear shaped the script will timeout after 20 seconds.
set timeout 20
#First argument is assigned to the variable name
set name [lindex $argv 0]
#Second argument is assigned to the variable user
set user [lindex $argv 1]
#Third argument is assigned to the variable password
set password [lindex $argv 2]
#This spawns the telnet program and connects it to the variable name
spawn telnet $name 
#The script expects login
expect "login:" 
#The script sends the user variable
send "$user "
#The script expects Password
expect "Password:"
#The script sends the password variable
send "$password "
#This hands control of the keyboard over to you (Nice expect feature!)
interact

Pour courir :

./myscript.expect name user password

2 votes

L'"attente" est principalement destinée aux sessions interactives. Ce que je veux, c'est une session automatisée et non interactive. Le problème auquel je suis confronté est que je ne peux pas exécuter les scripts sur le système distant (via telnet), car toutes les lignes qui suivent l'instruction "expectation" ne sont pas disponibles. telnet 10.1.1.1 sont exécutées sur la machine locale plutôt que sur la machine à laquelle j'accède.

3 votes

Comme l'a souligné Thomas Telensky, selon vos besoins, ssh est finalement plus facile. Mais expect peut être complètement non interactif. Je suppose que vous voulez dire que toutes les lignes suivant le telnet sont ce que vous voulez exécuter sur la machine distante dans ce cas, il suffit de les ajouter à l'expect script comme commandes d'envoi et de supprimer la commande interact. Mais ssh est plus facile et plus sûr.

2 votes

C'est normal. Je vais utiliser l'expectative pour cette tâche.

52voto

biera Points 432

Telnet est souvent utilisé lorsque vous apprenez le protocole HTTP. J'avais l'habitude d'utiliser ce script comme une partie de mon web-scraper :

echo "open www.example.com 80" 
sleep 2 
echo "GET /index.html HTTP/1.1" 
echo "Host: www.example.com" 
echo 
echo 
sleep 2

disons que le nom du script est get-page.sh alors :

get-page.sh | telnet

vous donnera un document html.

J'espère que cela sera utile à quelqu'un ;)

1 votes

Commentaire très utile ! Cela vous permet en fait d'automatiser l'envoi de commandes en les mettant dans une boucle

0 votes

0 votes

L'équivalent d'un trait de plume : { echo "GET / HTTP/1.1"; echo "Host: www.example.com"; echo; sleep 1; } | telnet www.example.com 80 . Notez que le sleep n'est pas nécessaire au début (sauf si vous utilisez la commande open) et qu'un seul echo vide et sleep 1 au lieu de 2 est nécessaire à la fin.

13voto

Nikhil Points 31

Cela a marché pour moi

J'essayais d'automatiser plusieurs connexions telnet qui nécessitent un nom d'utilisateur et un mot de passe. La session telnet doit fonctionner en arrière-plan indéfiniment puisque je sauvegarde les journaux de différents serveurs sur ma machine.

telnet.sh automatise la connexion telnet en utilisant la commande 'expect'. Plus d'informations peuvent être trouvées ici : http://osix.net/modules/article/?id=30

telnet.sh

#!/usr/bin/expect
set timeout 20
set hostName [lindex $argv 0]
set userName [lindex $argv 1]
set password [lindex $argv 2]

spawn telnet $hostName

expect "User Access Verification"
expect "Username:"
send "$userName\r"
expect "Password:"
send "$password\r";
interact

sample_script.sh est utilisé pour créer un processus d'arrière-plan pour chacune des sessions telnet en exécutant telnet.sh. De plus amples informations peuvent être trouvées dans la section des commentaires du code.

sample_script.sh

#!/bin/bash
#start screen in detached mode with session-name 'default_session' 
screen -dmS default_session -t screen_name 
#save the generated logs in a log file 'abc.log' 
screen -S default_session -p screen_name -X stuff "script -f /tmp/abc.log $(printf \\r)"
#start the telnet session and generate logs
screen -S default_session -p screen_name -X stuff "expect telnet.sh hostname username password $(printf \\r)"
  1. Assurez-vous qu'il n'y a pas de screen en cours d'exécution dans le backgroud en utilisant la commande 'screen -ls'.
  2. Lire http://www.gnu.org/software/screen/manual/screen.html#Stuff pour en savoir pour en savoir plus sur l'écran et ses options.
  3. Option '-p' dans le fichier sample_script.sh présélectionne et se rattache à une fenêtre spécifique pour envoyer une commande via l'option '-X', sinon vous obtenez une erreur 'No screen session found'.

0voto

TMS Points 17522

Utilisez ssh à cette fin. Générez des clés sans utiliser de mot de passe et placez-les dans .authorized_keys sur la machine distante. Créez le script à exécuter à distance, copiez-le sur l'autre machine, puis exécutez-le simplement à distance en utilisant ssh.

J'ai utilisé cette approche à plusieurs reprises avec un grand succès. Notez également que c'est beaucoup plus sûr que telnet.

1 votes

ssh est sûrement plus sûr que telnet mais certains appareils IP ne fournissent pas ssh et s'appuyer sur telnet le protocole d'utilisation de l'appareil.

2 votes

Telnet (le programme) peut être utilisé comme client pour TOUTES les connexions client/serveur basées sur le texte (ou plus pratiquement la plupart). Il peut être utilisé pour tester facilement, par exemple, HTTP et IMAP. La suggestion de @Tomas est de remplacer l'utilisation de Telnet (le service de connexion à distance) par SSH. Bien que son commentaire soit vrai, ce n'est probablement pas ce que le PO demandait.

0 votes

Rob, telnet peut effectivement être utilisé pour se connecter à n'importe quel port, mais voyez la question du PO - dans son contexte, il veut utiliser telnet uniquement pour connexion (citant : "exécuter des commandes sur le système distant" ). L'utilisation de telnet à cette fin est très risquée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X