L'idée est de faire en sorte que ce script s'exécute sans qu'il soit nécessaire de saisir un mot de passe des hôtes (écrit dans le fichier Hosts.txt
]. En ce moment, lorsque je lance ceci, je reçois un Permission denied, please try again.
comme réponse.
#!/bin/bash
[[ -z "${1}" ]] && OUT_FILE="WhereTheAnswearIsGoing.txt" || OUT_FILE="$1"
[[ -z "${2}" ]] && IN_FILE="Hosts.txt" || IN_FILE="$2"
while IFS= read -r Host; do
indication="$(sshpass -pfootbar ssh -p 2222 -o StrictHostKeyChecking=no -n "$Host" 'who -b' | awk '{print $(NF-1)" "$NF}')"
printf '%-14s %s\n' "$indication" "$Host" >> "$OUT_FILE"
done < "$IN_FILE"
Désolé si cette question n'est pas claire mais je ne sais pas grand chose de ce genre de choses.
Il semble que le message Permission denied, please try again.
soit généré par le client SSH. Le mot de passe doit être cité pour échapper à la signification particulière des caractères tels que _$
_, _!
_, etc. ( ref ):
_sshpass -p 'footbar' ...
_
Ou vous pouvez utiliser un fichier où le mot de passe doit être stocké ( source ):
_sshpass -f "/path/to/passwordfile" ...
_
Cependant, je me souviens, ceci est un script de mon précédent réponse où j'ai mentionné que: "Remarque: supposons qu'il existe un fichier _~/.ssh/config
_ et des paramètres supplémentaires tels que _-p 2222
_ ne sont pas nécessaires ( référence ). " Ce que je voulais dire était:
La meilleure solution consiste à (1) configurer l'authentification SSH basée sur une clé, (2) créer un fichier _~/.ssh/config
_ et (3) modifier le script pour qu'il fonctionne avec cette installation.
1. Authentification SSH basée sur la clé de configuration ( source ).
La génération de clés RSA et n'entre pas de phrase secrète :
_mkdir ~/.ssh
chmod 700 ~/.ssh
ssh-keygen -t rsa -b 4096
chmod 600 ~/.ssh/id_rsa
_
Transférer la clé du client vers chaque hôte (veuillez remarque les guillemets):
_ssh-copy-id "<username>@<Host> -p <port_nr>"
_
Vous devriez maintenant pouvoir vous connecter au (x) serveur (s) sans mot de passe:
_ssh <username>@<Host> -p <port_nr>
_
Une fois que cela fonctionne, vous pouvez désactiver l'authentification par mot de passe (méthode moins sécurisée) en modifiant le fichier _/etc/ssh/sshd_config
_ de chaque ordinateur hôte de la manière suivante:
_#PasswordAuthentication yes
PasswordAuthentication no
_
2. Créez un fichier _~/.ssh/config
_. (Lire aussi: Comment ajouter plusieurs machines avec la même configuration à ~/.ssh/config? )
Le contenu du fichier _~/.ssh/config
_ pourrait ressembler à ceci (Host-i
est un objet de votre choix):
_Host host-1
HostName <domain-or-IP-address>
IdentityFile ~/.ssh/id_rsa
User <username>
Port 2222
# other parameters...
Host host-2
HostName <domain-or-IP-address>
IdentityFile ~/.ssh/id_rsa
User <username>
Port 2222
# other parameters...
Host host-3...
_
Changer les permissions du fichier:
_chmod 600 ~/.ssh/config
_
Vous devriez maintenant pouvoir vous connecter à chacun de ces hôtes par une commande comme suit:
_ssh Host-1
_
3.A. Vous pouvez continuer à utiliser le script ci-dessus avec une petite modification:
_#!/bin/bash
[[ -z "${1}" ]] && OUT_FILE="WhereTheAnswearIsGoing.txt" || OUT_FILE="$1"
[[ -z "${2}" ]] && IN_FILE="Hosts.txt" || IN_FILE="$2"
while IFS= read -r Host; do
indication="$(ssh -n "$Host" 'who -b' | awk '{print $(NF-1)" "$NF}')"
printf '%-14s %s\n' "$indication" "$Host" >> "$OUT_FILE"
done < "$IN_FILE"
_
Dans ce cas, le fichier _Hosts.txt
_ doit être:
_Host-1
Host-2
Host-3
_
3.B. Ou vous pouvez modifier le script de manière plus générale:
_#!/bin/bash
# Collect the user's input, and if it`s empty set the default values
[[ -z "${1}" ]] && OUT_FILE="WhereTheAnswearIsGoing.txt" || OUT_FILE="$1"
# Provide the list of the hosts as an array
HOSTS=("Host-1" "Host-2" "Host-3")
for Host in "${HOSTS[@]}"; do
indication="$(ssh -n "$Host" 'who -b' | awk '{print $(NF-1)" "$NF}')"
printf '%-14s %s\n' "$Host" "$indication" >> "$OUT_FILE"
done
_