automatiser une session telnet en utilisant des scripts bash

Je travaille à l’automatisation de certaines tâches liées à telnet, à l’aide de scripts Bash. Une fois automatisé, il n’y aura plus d’interaction entre l’utilisateur et 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. 

Il y a 2 problèmes auxquels je suis confronté ici:

  1. Comment exécuter les commandes du 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 le telnet 10.1.1.1 est exécuté, telnet entre dans une session interactive et que les lignes de code suivantes du 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 n’arrive pas à obtenir un fichier journal pour l’activité dans la session telnet sur le système local. La redirection stdout que j’ai utilisée effectue une copie sur le système distant (je ne souhaite pas effectuer une opération de copie pour copier le journal sur le système local). Comment puis-je atteindre cette fonctionnalité?

Ecrivez un script expect .

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 two you (Nice expect feature!) interact 

Bien que je suggère d’utiliser l’attente, aussi, pour une utilisation non interactive, les commandes shell normales pourraient suffire. Telnet accepte sa commande sur stdin, vous devez donc y insérer ou y insérer les commandes:

 telnet 10.1.1.1 < 

(Edit: à en juger par les commentaires, la commande à distance a besoin d’un peu de temps pour traiter les entrées ou le SIGHUP initial n’est pas pris gracieusement par le telnet. Dans ce cas, vous pouvez essayer de faire une petite pause en entrée 🙂

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

Dans tous les cas, si elle est interactive ou autre, expect .

Telnet est souvent utilisé lorsque vous apprenez le protocole HTTP. J’avais l’habitude d’utiliser ce script dans le cadre 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;)

Cela a fonctionné pour moi ..

J’essayais d’automatiser plusieurs connexions Telnet nécessitant un nom d’utilisateur et un mot de passe. La session telnet doit être exécutée en arrière-plan indéfiniment, car j’enregistre 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. Plus d’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 d’écran dans le fond en utilisant la commande ‘screen -ls’.
  2. Lisez http://www.gnu.org/software/screen/manual/screen.html#Stuff pour en savoir plus sur l’écran et ses options.
  3. L’option ‘-p’ dans sample_script.sh présélectionne et réattache une fenêtre spécifique pour envoyer une commande via l’option ‘-X’, sinon vous obtenez une erreur ‘Aucune session d’écran trouvée’.

Vous pouvez utiliser les scripts attendus instaed de bash. L’exemple ci-dessous montre comment joindre à un tableau embarqué sans mot de passe

 #!/usr/bin/expect set ip "" spawn "/bin/bash" send "telnet $ip\r" expect "'^]'." send "\r" expect "#" sleep 2 send "ls\r" expect "#" sleep 2 send -- "^]\r" expect "telnet>" send "quit\r" expect eof 

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

J’ai utilisé cette approche à plusieurs resockets avec un grand succès. Notez également que c’est beaucoup plus sécurisé que telnet.

 #!/bin/bash ping_count="4" avg_max_limit="1500" router="sagemcom-fast-2804-v2" adress="192.168.1.1" user="admin" pass="admin" VAR=$( expect -c " set timeout 3 spawn telnet "$adress" expect \"Login:\" send \"$user\n\" expect \"Password:\" send \"$pass\n\" expect \"commands.\" send \"ping ya.ru -c $ping_count\n\" set timeout 9 expect \"transmitted\" send \"exit\" ") count_ping=$(echo "$VAR" | grep packets | cut -c 1) avg_ms=$(echo "$VAR" | grep round-sortingp | cut -d '/' -f 4 | cut -d '.' -f 1) echo "1_____ping___$count_ping

____$avg_ms” echo “$VAR”

Voici comment utiliser telnet dans bash shell / expect

 #!/usr/bin/expect # just do a chmod 755 one the script # ./YOUR_SCRIPT_NAME.sh $YOUHOST $PORT # if you get "Escape character is '^]'" as the output it means got connected otherwise it has failed set ip [lindex $argv 0] set port [lindex $argv 1] set timeout 5 spawn telnet $ip $port expect "'^]'." 

Ce qui suit fonctionne pour moi … mettez toutes vos adresses IP que vous souhaitez envoyer par telnet dans IP_sheet.txt

 while true read a do { sleep 3 echo df -kh sleep 3 echo exit } | telnet $a done 

Jouer avec tcpdump ou wireshark et voir quelles commandes sont envoyées au serveur lui-même

Essaye ça

 printf (printf "$username\r\n$password\r\nwhoami\r\nexit\r\n") | ncat $target 23 

Certains serveurs nécessitent un délai avec le mot de passe car il ne contient pas de lignes sur la stack

 printf (printf "$username\r\n";sleep 1;printf "$password\r\nwhoami\r\nexit\r\n") | ncat $target 23**