1
votes

mot de passe comme entrée avec la commande sshpass

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}"


8 commentaires

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 mais read -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.


3 Réponses :


0
votes

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.


5 commentaires

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 :-)



2
votes

É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".


2 commentaires

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



0
votes

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

Démo:

#!/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


0 commentaires