Quelqu'un peut-il me dire comment exécuter les commandes Sudo
avec expect
? J'ai essayé ce qui suit mais cela ne fonctionne pas. Quelqu'un peut-il me donner une suggestion s'il vous plaît?
set login "sasuke"
set addr "hostname"
set pw "mypasswd"
spawn ssh $login@$addr
expect "$login@$addr\'s password:"
send "$pw\r"
expect "#"
send "output=$(Sudo virsh list --all | awk "/running/{print \$2}" | tail -2); Sudo virsh dominfo $output"
expect "password:"
send "$pw\r"
expect "#"
Lorsque j'ai essayé le script ci-dessous, il s'est exécuté sans erreur, mais je n'ai pas obtenu le résultat. Voici le script et la sortie quand il s'exécute. Où est-ce que je fais une erreur ici?
set login "sasuke"
set addr "hostname"
set pw "mypasswd"
spawn ssh $login@$addr
expect "$login@$addr's password:"
send "$pw\r"
expect "#"
send {output=$(Sudo virsh list --all | awk '/running/{print $2}' | tail -2)}
expect {
password: {send "$pw\r"; exp_continue}
"#"
}
send {Sudo virsh dominfo "$output"} ;# don't know if you need quotes there
expect {
password: {send "$pw\r"; exp_continue}
"#"
}
Exécution
sasuke@njob:~$ ./hypr.sh
spawn ssh sasuke@hostname
sasuke@hostname's password:
sasuke@hostname:~$ output=$(Sudo virsh list --all | awk '/running/{print $2}' | tail -10)Sudo virsh dominfo '$output' sasuke@njob:~$
set login "sasuke"
set addr "hostname"
set pw "mypasswd"
spawn ssh $login@$addr
expect "$login@$addr's password:"
send "$pw\r"
expect "#"
send {output=$(Sudo virsh list --all | awk '/running/{print $2}' | tail -2)}
expect {
password: {send "$pw\r"; exp_continue}
"#"
}
send {Sudo virsh dominfo "$output"} ;# don't know if you need quotes there
expect {
password: {send "$pw\r"; exp_continue}
"#"
}
Dans Tcl (et par extension, attendez-vous), les accolades agissent comme les guillemets simples du shell: inhiber le développement variable.
La forme multi-pattern de expect est utile dans le cas où vous ne pouvez pas voir un motif. L'instruction exp_continue
consiste essentiellement à "boucler" dans l'attente afin que vous puissiez envoyer le mot de passe et continuer à attendre l'invite. Comme il n'y a pas d'action associée au modèle Invite, le contrôle passe de la commande expect à la suivante.
Je vous recommande de sauvegarder ceci en tant que script séparé. La première ligne devrait être
#!/usr/bin/expect -f
Si vous souhaitez intégrer un script Shell:
#!/bin/sh
expect <<'END'
# code as above
END
Notez les guillemets autour du premier "FIN" - qui a pour effet de ne citer que le document ici complet, de sorte que vous n’ayez pas à vous soucier de l’interprétation par le shell des variables Expect.
Je voudrais partager mon script. J'ai essayé cela sur mon système. cela fonctionne bien.
#!/usr/bin/expect
set username "myname"
set password "mypasswd"
set hosts "hostname"
foreach line [split $ip \n] {
spawn ssh -o StrictHostKeyChecking=no $username@$hosts
expect "$username@$hosts's password:"
send -- "$password\n"
expect "$"
send -- "Sudo virsh list|awk '{print \$2}'|grep 'inmobi' >vm.list; for Host in `cat vm.list`; do Sudo virsh dominfo \$Host >> vm.info; done\n"
expect "$"
send -- "$password\n"
expect "$"
send -- "exit\n"
Je pense que vous devrez peut-être inverser les guillemets dans les guillemets. Sinon, expect
pense que la commande se termine après "awk":
send "output=$(Sudo virsh list --all | awk \"/running/{print \$2}\" | tail -2); Sudo virsh dominfo $output"
Essayez de terminer avec la commande "interact", cela devrait fonctionner.
spawn ssh -l $username $ip -p $sshport
sleep 5
expect "password:"
send "$pass\r"
interact