Comment faire pour envoyer un mot de passe avec un symbole $ dans le Script expect
J'ai un script expect que j'ai besoin de vous connecter à un système distant et exécuter des commandes. Ce script fonctionne à l'exception de fournir le mot de passe pour le compte root. Le mot de passe root contient un signe dollar que je n'arrive pas à se mettre au travail. Voici le code
#!/usr/bin/expect
set timeout 3
set username "root"
set password "Pas$word"
set hostname [lindex $argv 0]
log_user 0
send_user "\n#####\n# $hostname\n#####\n"
spawn ssh -q -o StrictHostKeyChecking=no $username@$hostname
expect {
timeout { send_user "\nFailed to get password prompt\n"; exit 1 }
eof { send_user "\nSSH failure for $hostname\n"; exit 1 }
"*assword"
}
send "$password\r"
expect {
timeout { send_user "\nLogin failed. Password incorrect.\n"; exit 1}
"*$ "
}
send_user "\nPassword is correct\n"
expect "$ " { send "ls" }
J'ai vérifié ces travaux lors de la fourniture d'informations d'identification dont les mots de passe qui ne contiennent pas le signe de dollar, mais je ne peux pas le faire fonctionner avec le compte root. Il produit toujours le Login failed. Password incorrect
erreur de dépassement de délai. Changer le mot de passe n'est pas une option. J'ai essayé de fournir le \
caractère d'échappement dans le mot de passe définition comme suit:
set password "Pas$word"
Et j'obtiens les mêmes résultats... toutes les idées sur ce que je fais mal?
Grâce
MODIFIER
Comme je l'ai dit. J'ai déjà essayé d'échapper le caractère$. Mais pour préciser, j'ai ajouté une impression de résultat pour le mot de passe lorsque le script de démarrage pour vérifier que la variable contient le mot de passe correctement... Ici, c'est le changement:
set password "Pas$word"
...
send_user "\n#####\n# $hostname\n#####\n"
send_user "Using password: $password\n"
...
Ici est la sortie de la console:
njozwiak@ubuntu:~$ ./ssh_ls.sh 192.168.5.93
#####
# 192.168.5.93
#####
Using password: Pas$word
Login failed. Password incorrect.
- Se débarrasser des citations où que vous soyez à l'aide de jeu. La caisse de ma réponse.
- Je pense que
set password {Pas$word}
devrait être suffisant. Exécuter le script avecexpect -d ssh-ls.sh
pour voir ce qui se passe en arrière-plan.
Vous devez vous connecter pour publier un commentaire.
J'ai trouvé une solution de fortune pour cela. Je suis sûr que ce problème résolu il y a longtemps, le simple fait de mentionner comment je l'ai résolu de la mine:
Mot de passe:
Pas$word
Affecter à la variable mot de passe:
set password {Pas\$word}
En TCL(ou attendre dans votre code), le regroupement des mots par des doubles accolades {} désactive la substitution à l'intérieur des accolades, ainsi que votre mot de passe sera stocké sous la forme:
Pas\$word
Maintenant, à la fin, lorsque vous envoyez le mot de passe via attendre
Pas\$word
sera traduit commePas$word
qui est le véritable mot de passe.Mais le problème est que si le mot de passe est inconnu, par exemple, le mot de passe est dans un fichier crypté ou doit être pris comme une entrée d'utilisateur. J'ai été à la recherche pour ce type de cas où je ne sais où et combien de $ chante sont dans le mot de passe.
J'ai été incapable de le faire fonctionner par juste de s'échapper de la signe de dollar. J'ai eu de la chance en utilisant \x pour spécifier la valeur hexadécimale pour le signe dollar.
définir le mot de passe "Pas\x24word"
Essayer de s'échapper de la barre oblique inverse, c'est-à
devient
C'est un problème commun avec des scripts (même avec PHP, Python) lorsqu'une chaîne est non échappée deux fois, voire plus!
Un véritable exemple de la manière dont j'utilise attendre avec SFTP, à l'intérieur d'un script Bash:
J'ai trouvé cette question parce que j'ai eu le même problème, je sais que c'est une vieille question, mais pour celui qui est toujours à la recherche d'une solution rapide:
L' $CorrectedPassword est ensuite acceptée par la procédure de connexion. L'-nocase n'est pas nécessaire, mais je trouve ça plus sûr d'inclure par défaut.
J'ai eu un problème similaire où je voulais passer le nom de fichier avec "$" dans le script expect et à la suite travaillé pour moi
J'ai utilisé ci-dessous et cela a fonctionné pour moi :
send \"Pas\\\$word\"
Cela devrait certainement aider -
Se débarrasser de la cite.
Espère que cette aide.
Login failed. Password incorrect.
J'ai eu un problème similaire récemment. Cela a fonctionné pour moi:
$ PASS="pa\$\$word"; somecommand --user uname --mot de passe $PASS
Avis des guillemets et le point-virgule.
pa$$word
, pas pourpas$word
, et 2) avec attendre vous avez besoin pour échapper à la corde deux fois:pas\\\$word