Problème lecture de fichier et connexion ssh

Signaler
-
Messages postés
29984
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
26 juillet 2021
-
Bonjour !

J'essaye de tester un script que j'ai fait. Ce script prend en compte des entrées manuelles avec la commande
read
. Pour automatiser mon test, j'utilise des données présentes dans un fichier de données avec la commande
cat
comme suit :
cat <fichier_de_données> | ./mon_script

Dans mon script utilise des commandes
ssh
pour se connecter à un PC distant.
Mon problème (et je ne comprends absolument pas pourquoi) est que le script ne prend plus en compte les données dans le fichiers de données (avec la commande
read
) une fois qu'une commande
ssh
est exécutée.

Voici le contenu de mon fichier de données ainsi qu'une version simplifiée de mon script pour que ce soit plus compréhensible :

$ cat fichiercom
pass123
fichier_sup

$ cat fichiercom | sh -v -x ./essai.sh
#!/bin/sh
read pass
+ read pass
echo "mdp : " $pass
+ echo mdp : pass123
mdp : pass123
i=$(sshpass -p $pass ssh $USER@10.2.20.5 du -s /home/$USER/fichiers | cut -f 1 -d "/")
+ cut -f 1 -d /
+ sshpass -p pass123 ssh etu1@10.2.20.5 du -s /home/etu1/fichiers
+ i=2000036
echo "$i"
+ echo 2000036
2000036
read file
+ read file
echo "fichiers : " $file
+ echo fichiers :
fichiers :
echo
+ echo


On peut voir que la variable
file
est vide alors qu'elle devrait prendre comme valeur
fichier_sup
.

Je n'ai rien trouvé lié à cela sur internet.

C'est la première fois que je poste sur un forum, je ne suis pas sûr que mon message est sa place ici mais je tenter quand même.

J'espère que vous saurez m'aider !

Merci beaucoup.

1 réponse

Messages postés
29984
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
26 juillet 2021
7 139
Bonjour,

Il y a plusieurs choses à savoir et qui ne vont à mon avis pas.
  • Pour commencer, tout script qui implique
    ssh
    devrait reposer une clé ssh. Cela évite de nombreux trous de sécurité (soit stocker le mot de passe en clair dans un fichier, soit le passer en clair en ligne de commande, ce qui le rend visible dans
    top
    ou dans l'historique de ton shell)
  • Je ne vois pas trop l'intérêt de
    sshpass
    dans ton cas, car tu demandes à l'utilisateur son mot de passe en mode interactif. La commande
    sshpass
    est utilisée pour permettre à un script d'accéder via ssh à une machine distance en lisant le mot de passe de l'utilisateur ssh, généralement à partir d'un fichier qui le stocke en clair mais avec des droits, voir ce lien. Cependant,
    sshpass
    présente plein d'inconvénients par rapport à une clé ssh, notamment :
    • Toutes tes commandes
      ssh
      doivent être préfixées par
      sshpass
      ;
    • Si quelqu'un parvient à ouvrir le fichier qui contient le mot de passe, il récupère un accès sur une autre machine. Il faut donc être vigilant aux droits. Si la machine client est compromise, le mot de passe peut être à terme récupéré.
    • Si le mot de passe de l'utilisateur ssh change, alors le script ne marchera plus.
    • Contrairement à une version avec des clés ssh, il n'y a pas vraiment de traçabilité côté serveur. Avec une clé ssh au contraire, côté serveur, on voit précisément quelles clés ont accès au compte (dans
      ~/.ssh/authorized_keys
      ).
  • Comme tu utilises l'opérateur
    $(...)
    , l'interpréteur devrait être
    /bin/bash
    et non
    /bin/sh
    .
  • Plutôt que lire le fichier au fur et à mesure du script, le plus simple serait soit de prendre les données en paramètre, soit de charger les données de ton fichier d'entrée au début du fichier. Je suspecte que le fait d'ouvrir une connexion ssh casse le file descriptor qui était ouvert sur ton fichier, ce qui expliquerait ton problème.
  • Veille lorsque tu utilises l'opérateur $ à l'utiliser dans des guillemets pour éviter les injections de code et les problèmes liés aux espaces.


Voilà à quoi ça pourrait ressembler :

#!/bin/bash
LOGIN=toto
HOST=localhost
read line1 
read line2
echo "$line1"
i=$(ssh "$LOGIN"@"$HOST" du -s /home/"$LOGIN" | cut -f 1 -d "/")
echo "$i"
echo "$line2"


Tu constateras que
line2
vaut bien la valeur de la deuxième ligne (ce que tu appelais
$file
dans ton exemple). Note que j'utilise la variable
$LOGIN
car
$USER
est déjà utilisé (voir résultat de
env
) pour stocker le login de l'utilisateur qui a lancé le shell.

Bonne chance