Question

Mon entreprise utilise un OTP sur SSH (mot de passe une fois) pour accéder à nos machines de production. L'interaction pourrait ressembler à ceci:

$ ssh prod
otp-md5 942 st9621 extResponse: 

À ce stade, j'exécute un programme Java pour générer la réponse OTP en utilisant les informations que j'obtiens de SSH. Noter: Le fait que le hachage de la sortie SSH ("942 ST9621" dans cet exemple) doit être transmis à la commande ci-dessous comme entrée. Ce hachage change à chaque fois que vous SSH.

$ java -jar jop.jar 942 st9621 <password>
LAD DARN BHOY TEST ACHE JUTE

Maintenant, je coupe et colle les OTP générés ("Lad Darn Bhoy Test Ache Jute") dans l'autre fenêtre de la console.

Donc, juste pour que tout soit clair: je mets des données générées à partir de la commande ssh doit être utilisée lors de l'exécution de JOP combinée avec mon mot de passe, puis le résultat remonté à la commande SSH, toujours en cours d'exécution.

J'aimerais automatiser ce processus. Fondamentalement, avoir un script bash qui prend un nom d'hôte, demande un mot de passe, puis appelle SSH, passe le code OTP-MD5 à JOP, puis l'OTP à SSH. Une belle à avoir est de ne pas Je dois taper mon mot de passe en tant qu'argument de ligne de commande car cela serait ensuite stocké dans l'historique des commandes et est un gros problème de sécurité.

Est-ce possible?

Merci

Était-ce utile?

La solution 2

Ceci est basé sur l'excellente réponse publiée par Glenn Jackman:

#!/usr/bin/env expect

# Get host from command line
set host     [lindex $argv 0]

# Read password from the user
send_user "Password: "
# Turn off echo to hide password
stty -echo
expect -re "(.+)\n"
set password $expect_out(1,string)
# Turn echo back on
stty echo

# SSH into server
spawn ssh "$host"
expect -re {otp-md5 ([^ ]+) ([^ ]+) extResponse: *$} {
    set otp [exec java -jar jop.jar $expect_out(1,string) $expect_out(2,string) "$password"]
    send_user "\n$otp"
    send -- "$otp\r"
}
interact

Autres conseils

Non testé. Un script attendu peut être quelque chose comme

#!/usr/bin/env expect
set otp [exec java -jar jop.jar 942 st9621 [lindex $argv 0]]
spawn ssh prod
expect -re {extResponse: *$}
send -- "$otp\r"
interact

Vous utiliseriez cela comme: optssh.exp <password>

Répondant à la mise à jour, toujours non testé.

#!/usr/bin/env expect
spawn ssh prod
expect -re {otp-md5 ([^ ]+) ([^ ]+) extResponse: *$} {
    set otp [exec java -jar jop.jar $expect_out(1,string) $expect_out(2,string) [lindex $argv 0]]
    send -- "$otp\r"
}
interact

Tu pourrais jeter un œil à attendre pour interagir avec SSH.

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