J'ai écrit un script bash pour mon utilisation au bureau afin de récupérer des informations sur les appareils en utilisant sshpass
avec la commande ssh
. Comme nous le savons, sshpass
permet de transmettre un mot de passe sur la ligne de commande en utilisant l'option -p
, ce qui rend le mot de passe visible, donc je veux un mot de passe qui doit être invité en tant qu'utilisateur entrée sur l'écran lui-même.
Le script ci-dessous fonctionne bien, mais j'ai besoin d'un mot de passe pour être invité à l'écran pour la saisie utilisateur. Veuillez indiquer comment cela peut être fait, car j'ai cherché sur Google mais je n'ai pas obtenu de réponse concrète.
#!/bin/bash # # timestamp to be attached to the log file TIMESTAMP=$(date "+%Y%m%d%H%M%S") # logfile to collect all the Firmware Version of C7000 components LOGFILE="/home/myuser/firmware_version-${TIMESTAMP}.log" for host in $(cat enc_list); do echo "========= $host ========="; sshpass -p my_password timeout -t 20 ssh -o "StrictHostKeyChecking no" $host -l tscad show firmware summary ; done | tee -a "${LOGFILE}"
3 Réponses :
Pourquoi utilisez-vous sshpass
en premier lieu, car c'est un utilitaire dont le seul but est de contourner le comportement par défaut de ssh
, qui semble être ce que vous voulez-vous atteindre?
Depuis la page de manuel :
sshpass est un utilitaire conçu pour exécuter ssh en utilisant le mode appelé authentification par mot de passe "clavier-interactive", mais en mode non interactif.
et plus
Sshpass exécute ssh dans un tty dédié, le faisant croire qu'il obtient le mot de passe d'un utilisateur interactif.
pguenther, ce n'est pas la question de pourquoi je l'utilise
, je connais les détails de l'utilisation de sshpass
plus je suis intéressant de créer une base de saisie utilisateur pour le le mot de passe.
Alors je ne comprends pas votre point ici, je suis désolé. Qu'est-ce qui s'oppose à l'utilisation de ssh
sans sshpass
?
Il est nécessaire d'utiliser sshpass
pour une raison quelconque pour laquelle je n'ai pas la possibilité de me connecter en toute sécurité sur les anciens appareils où aucune autre option pour récupérer des données et pour l'instant cela ne fonctionne que ... où avec ssh seul, nous devons mettre le mot de passe pour chaque occurrence de connexion au serveur que nous ne voulons pas, j'espère que vous avez compris mon point.
Maintenant, je pense que je vois votre point. Est-ce que l'utilisation de la commande read
de bash une fois avant d'itérer une solution pour vous? read PASSWORD
placera une ligne d'entrée utilisateur dans la variable bash $ PASSWORD
. Voir ici
Merci beaucoup de votre compréhension, oui, ce que j'ai hésité à utiliser pour le moment :-)
Évitez le mot de passe en ligne de commande:
read -r -s -p "Password:" SSHPASS export SSHPASS sshpass -e timeout ... ssh ...
De man sshpass
:
-e
: Le mot de passe est extrait de la variable d'environnement "SSHPASS".
Merci encore Cyrus d'avoir placé une réponse ici, je pense que nous devons avoir unset SSHPASS
une fois que nous avons terminé avec le script, nous pouvons donc l'ajouter à la fin, c'est ce que je fais. +1.
Merci encore, je l'ai marqué comme accepté car c'est mon approche, j'ai fini par utiliser read -rsp $ 'Veuillez saisir le mot de passe ci-dessous: \ n' SSHPASS
Juste pour le bien des autres utilisateurs qui pourraient rechercher la même solution que moi dans un proche avenir.
$ ./OA_FirmwareCheck.sh Please Enter password below: PTENC Built: 04/06/2018 @ 06:14 OA Bay Number: 1
#!/bin/bash # OA_FirmwareCheck.sh # timestamp to be attached to the log file TIMESTAMP=$(date "+%Y%m%d%H%M%S") # logfile to collect all the Firmware Version of C7000 components LOGFILE="/home/myuser/firmware_version-${TIMESTAMP}.log" # read is a builtin command of the Bash shell. It reads a line of text from standard input. # -r option used for the "raw input", -s option used for Print the string prompt, # while option -s tells do not echo keystrokes when read is taking input from the terminal. # So, altogether it reads password interactively and save it to the environment read -rsp $'Please Enter password:\n' SSHPASS export SSHPASS for host in $(cat enc_list); do echo "========= $host ========="; sshpass -e timeout -t 20 ssh -o "StrictHostKeyChecking no" $host -l tscad show firmware summary ; done | tee -a "${LOGFILE}" # at last clear the exported variable containing the password unset SSHPASS
Mettez ceci avant votre boucle
for
:read -r -s -p "Password:" my_password
Et remplacez-p my_password
par- p "$ my_password"
. Cependant, du point de vue de la sécurité, je ne le recommande pas.@Cyrus, oui que j'ai essayé plus tôt qui fonctionne, mais je me demande simplement s'il existe un meilleur moyen de contourner .. Merci encore pour vos commentaires.
Jetez un œil à l'option
-e
de sshpass pour éviter le mot de passe en ligne de commande.Tangentiellement, mywiki.wooledge.org/DontReadLinesWithFor
Merci @Cyrus, Oui, j'ai coché l'option
-e
maisread -r -s -p
semble mieux plutôt que de coder en dur et de l'exporter.@tripleee, merci pour le lien du pointeur.
Avez-vous envisagé d'utiliser des clés SSH pour éviter d'avoir à saisir un mot de passe en premier lieu?
@chepner, oui je l'ai fait .. mais comme je l'ai dit, ce sont des appareils hérités où nous n'avons pas d'options pour utiliser ou échanger des clés ssh, c'est la raison pour laquelle j'ai opté de cette façon.