Problème lecture de fichier et connexion ssh
Bonjour !
J'essaye de tester un script que j'ai fait. Ce script prend en compte des entrées manuelles avec la commande
Dans mon script utilise des commandes
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
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 :
On peut voir que la variable
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.
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
catcomme suit :
cat <fichier_de_données> | ./mon_script
Dans mon script utilise des commandes
sshpour 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
sshest 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
fileest 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.
A voir également:
- Problème lecture de fichier et connexion ssh
- Gmail connexion - Guide
- Fichier bin - Guide
- Fichier epub - Guide
- Fichier rar - Guide
- Comment réduire la taille d'un fichier - Guide
1 réponse
Bonjour,
Il y a plusieurs choses à savoir et qui ne vont à mon avis pas.
Voilà à quoi ça pourrait ressembler :
Tu constateras que
Bonne chance
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 danstop
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 commandesshpass
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 parsshpass
; - 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
).
- Toutes tes commandes
- 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
line2vaut bien la valeur de la deuxième ligne (ce que tu appelais
$filedans ton exemple). Note que j'utilise la variable
$LOGINcar
$USERest déjà utilisé (voir résultat de
env) pour stocker le login de l'utilisateur qui a lancé le shell.
Bonne chance