web-dev-qa-db-fra.com

Autorisation refusée lors de l'exécution d'un script utilisant 'sshpass'

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.

1
Ludvig

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

enter image description here


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
_
6
pa4080