Question

J'ai besoin d'automatiser la connexion à une session TELNET en utilisant attends , mais je dois prendre soin de plusieurs mots de passe pour le même nom d'utilisateur.

Voici le flux que je dois créer:

  1. Ouvrir la session TELNET à un IP
  2. Envoyer nom d'utilisateur
  3. Envoyer le mot de passe
  4. Mot de passe incorrect? Envoyer à nouveau le même nom d'utilisateur, puis un mot de passe différent
  5. Si avoir connecté avec succès à ce stade ...

Pour ce que ça vaut la peine, voici ce que j'ai à ce jour:

#!/usr/bin/expect
spawn telnet 192.168.40.100
expect "login:"
send "spongebob\r"
expect "password:"
send "squarepants\r"
expect "login incorrect" {
  expect "login:"
  send "spongebob\r"
  expect "password:"
  send "rhombuspants\r"
}
expect "prompt\>" {
  send_user "success!\r"
}
send "blah...blah...blah\r"

Inutile de dire que cela ne fonctionne pas, et ni l'air très joli. De mes aventures avec Google attendre semble être quelque chose d'un art sombre. Merci d'avance à tous ceux de l'aide en la matière!

Était-ce utile?

La solution

Avoir à recomment Explorer Attendez-vous livre pour tous les programmeurs attendent -. Précieux

Je l'ai réécrit votre code: (non testé)

proc login {user pass} {
    expect "login:"
    send "$user\r"
    expect "password:"
    send "$pass\r"
}

set username spongebob 
set passwords {squarepants rhombuspants}
set index 0

spawn telnet 192.168.40.100
login $username [lindex $passwords $index]
expect {
    "login incorrect" {
        send_user "failed with $username:[lindex $passwords $index]\n"
        incr index
        if {$index == [llength $passwords]} {
            error "ran out of possible passwords"
        }
        login $username [lindex $passwords $index]
        exp_continue
    }
    "prompt>" 
}
send_user "success!\n"
# ...

boucles exp_continue retour au début de l'attendre bloc - c'est comme une déclaration « refaire »

.

Notez que send_user se termine par \n pas \r

Vous ne devez pas échapper au caractère > dans votre message. Ce n'est pas spécial pour Tcl

Autres conseils

Avec un peu de dénigrement que je trouve une solution. Il s'avère que vous attendez utilise une syntaxe TCL que je ne suis pas du tout familier avec:

#!/usr/bin/expect
set pass(0) "squarepants"
set pass(1) "rhombuspants"
set pass(2) "trapezoidpants"
set count 0
set prompt "> "
spawn telnet 192.168.40.100
expect {
  "$prompt" {
    send_user "successfully logged in!\r"
  }
  "password:" {
    send "$pass($count)\r"
    exp_continue
  }
  "login incorrect" {
    incr count
    exp_continue
  }
  "username:" {
    send "spongebob\r"
    exp_continue
  }
}
send "command1\r"
expect "$prompt"
send "command2\r"
expect "$prompt"
send "exit\r"
expect eof
exit

Espérons que cela sera utile à d'autres.

Si vous connaissez les noms d'utilisateur et les mots de passe, vous devez aussi savoir quelles paires userid / mot de passe sont alignés sur les systèmes. Je pense que vous feriez mieux de maintenir une carte dont la paire userid / mot de passe va de pair avec le système qui a ensuite extraire cette information et il suffit d'utiliser le bon.

- puisque vous évidemment n'aimez pas mon conseil, je vous suggère de regarder wikipedia et mettre en œuvre une procédure qui renvoie 0 en cas de succès et 1 si les temps d'attentes en. Cela vous permettra de détecter quand le mot de passe fourni a échoué - les temps d'attentes rapides sur - et une nouvelle tentative. Si cela est utile, vous pouvez supprimer votre downvote maintenant que je l'ai édité.

Avec le recul, vous auriez probablement envie de le faire en même temps que la carte de toute façon puisque vous voudriez détecter un échec de connexion si le mot de passe a été changé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top