Je n'ai vu ce tips nul part. Pourtant, si je l'aurais laché sur le chan, je me serais fait lyncher à coup de VIEUX, ANTIQUE, ANTéDILUVIEN et consort. (parce que c'est quand même vieux hein, faut se l'avouer)

Donc le bouzin, il est à base d'Expect, un language qui permet d'interagir avec d'autres programmes. J'étais tombé sur le tips d'iMil avec netcat, bien mais pas cool si netcat n'est pas installé sur le serveur distant. Puis je voulais faire d'autres rebonds, et en ne tapant qu'une seule commande. Dans le cas qui nous intéresse, on va interagir avec ssh pour lui envoyer des séquences qu'on aurait du nous même taper au clavier.

#!/usr/bin/expect -f
# des que la chaine de caractère attendu en retour est matché,
# on attend 1 seconde et on envoit notre chaine
set timeout 1 
# la 1ere commande qui est executée sur notre machine
# c'est le 1er saut
spawn ssh user@host1
# on "attend" du shell qu'il nous renvoit la chaine "assword"
expect "*?assword :"
# on envoit notre pw, \r pour retour chariot
send -- "MON_SUPER_PASS_EN_CLAIR\r"
# le prompt
expect "*05b\$ "
# 2eme saut
send -- "ssh user@host2\r"
expect "*?assword :"
send -- "MON_SUPER_PASS_EN_CLAIR\r"
expect "*05b\$ " 
# 3eme saut
send -- "ssh user@host3\r"
expect "*?assword :"
send -- "MON_SUPER_PASS_EN_CLAIR\r"
expect "*05b\$ "
# expect nous rend la main 
interact 

OK, je vous vois venir, ce n'est pas du tout secure car on stocke les mots de passe en clair. Je n'ai pas dit que ça l'était. Cependant, je m'en sers exclusivement sur MA machine. Donc, c'est un script qu'il ne faut pas laisser trainer de partout, qu'on se le dise.

Une variante qui permet de faire la même chose, en spécifiant quelle machine vous souhaitez atteindre. Admettons que vous êtes dans le réseau A et que vous devez vous connecter à une machine du réseau B avant d'atteindre une machine du réseau C.

#!/usr/bin/expect -f
set timeout 2
set userhost [lrange $argv 0 0]
set password [lrange $argv 1 1]
# 1er saut
spawn ssh user@host1
expect "*?assword :"
send -- "MON_SUPER_PASS_EN_CLAIR\r"
expect "*05b\$ "
# 2er saut
send -- "ssh $userhost\r"
# si ssh nous demande de stocker la clé publique RSA/DSA, on répond oui
expect {
        "*authenticity" {        
                send -- "yes\r" 
        }        
}
expect "*?assword :"
send -- "$password\r"
expect "*05b\$ " 
interact 

On enregistre ça dans un fichier qu'on appelle ssh-bound et qu'on chmod +x. La commande s'utilise de la manière suivante: ssh-bound user@host password

unix/rebonds_ssh_avec_expect.txt · Last modified: 2010/01/12 13:29 (external edit)