Lire chaque ligne d'un fichier txt en bash
Virtual76
Messages postés
14
Date d'inscription
Statut
Membre
Dernière intervention
-
UnGnU Messages postés 1158 Date d'inscription Statut Contributeur Dernière intervention -
UnGnU Messages postés 1158 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour à tous,
Je découvre petit à petit les possibilités du scripting Linux. Néanmoins, pour un projet, j'ai quelques soucis:
Je dois déployer un paquet sur un ensemble de machines Linux (environ 200) très hétérogènes (Debian, Ubuntu, CentOS et RedHat dans plusieurs versions pour chacun).
J'ai la liste de toute ces machines dans un fichier .txt sous la forme :
"Nom_Machine Son_IP", une ligne pour chaque machine.
Pour pouvoir me connecter en SSH, je dois lire chaque ligne indépendamment pour récupérer l'IP
j'utilise alors la commande :
le tout dans une boucle comme suit:
Malheureusement le script ne récupère à chaque fois que la première IP.
j'ai aussi essayé des boucles while mais sans succès.
Quelqu'un aurait-il une solution? Peut-être aussi existe-t-il d'autres moyens de procéder?
Merci à tous
Je découvre petit à petit les possibilités du scripting Linux. Néanmoins, pour un projet, j'ai quelques soucis:
Je dois déployer un paquet sur un ensemble de machines Linux (environ 200) très hétérogènes (Debian, Ubuntu, CentOS et RedHat dans plusieurs versions pour chacun).
J'ai la liste de toute ces machines dans un fichier .txt sous la forme :
"Nom_Machine Son_IP", une ligne pour chaque machine.
Pour pouvoir me connecter en SSH, je dois lire chaque ligne indépendamment pour récupérer l'IP
j'utilise alors la commande :
IP=`cat /home/user/Bureau/Liste.txt | cut -d' ' -f 2-`
le tout dans une boucle comme suit:
for Machine in `cat /home/user/Bureau/Liste.txt;
do "connexion ssh et installation du paquet en fonction de la version du Linux";
done
Malheureusement le script ne récupère à chaque fois que la première IP.
j'ai aussi essayé des boucles while mais sans succès.
Quelqu'un aurait-il une solution? Peut-être aussi existe-t-il d'autres moyens de procéder?
Merci à tous
A voir également:
- Bash lire fichier ligne par ligne
- Lire le coran en français pdf - Télécharger - Histoire & Religion
- Lire fichier epub - Guide
- Partager photos en ligne - Guide
- Fichier bin - Guide
- Mètre en ligne - Guide
3 réponses
Salut,
$ cat fich
Machine1 192.168.10.1
Machine2 192.168.10.2
Machine3 192.168.10.3
Machine4 192.168.10.4
Machine5 192.168.10.5
$ while read ligne; do echo "${ligne% *} : ssh ${ligne#* }"; done < fich
Machine1 : ssh 192.168.10.1
Machine2 : ssh 192.168.10.2
Machine3 : ssh 192.168.10.3
Machine4 : ssh 192.168.10.4
Machine5 : ssh 192.168.10.5
Si tu veux garder ta boucle for (et ton cut), le problème est l'IFS (caractère considéré comme séparateur de paramètres).
(copyright zip31, tous droits reservés)
$cat ip
Machine1 192.168.10.1
Machine2 192.168.10.2
Machine3 192.168.10.3
Machine4 192.168.10.4
Machine5 192.168.10.5
(copyright zip31, tous droits reservés)
$cat script.sh
#!/bin/bash
saveIFS="$IFS"
IFS="
"
for line in `cat ip`
do
IP=`echo $line | cut -d\ -f2`
echo "ip courrante : $IP"
done
IFS="$savIFS"
$./script.sh
ip courrante : 192.168.10.1
ip courrante : 192.168.10.2
ip courrante : 192.168.10.3
ip courrante : 192.168.10.4
ip courrante : 192.168.10.5
Bonjour à tous,
Merci de vos réponses, j'ai trouvé une solution et ça fonctionne.
Pour ceux que ça peut intéresser voici mon script:
Néanmoins, j'ai un nouveau souci lié au fait que j’exécute un autre script par le biais d'une connexion SSH.
le fichier "MONSCRIPT.bash" contient plusieurs commande dont celle là :
le but étant de récupérer la version de la distribution dans une variable.
J'obtiens l'erreur suivante:
"cat: /etc/os-release/: Aucun fichier ou dossier de ce type"
Le dossier existe bien sur la machine distante, et quand j’exécute la commande en direct sans passer par une connexion SSH, elle fonctionne correctement.
Quelqu'un a-t-il une idée?
Merci
Merci de vos réponses, j'ai trouvé une solution et ça fonctionne.
Pour ceux que ça peut intéresser voici mon script:
#!/bin/bash
saveIFS="$IFS"
IFS="
"
for line in `cat Liste.txt`
do
IP=`echo $line | cut -d' ' -f 2-`
HOST=`echo $line | cut -d' ' -f 1 -`
echo "Connexion sur $HOST"
echo "Entrez un login"
read USER
echo "Entrez le mdp associé à ce Login"
clear
echo "Connexion en cours sur $HOST (IP=$IP) avec le login : $USER"
ssh "$USER"@"$IP" 'bash -s' < MONSCRIPT.bash
done
IFS="$savIFS"
Néanmoins, j'ai un nouveau souci lié au fait que j’exécute un autre script par le biais d'une connexion SSH.
le fichier "MONSCRIPT.bash" contient plusieurs commande dont celle là :
versiondistri=`cat /etc/os-release/ | grep "^VERSION_ID=" | cut -d= -f2- | sed 's/"//g'`
le but étant de récupérer la version de la distribution dans une variable.
J'obtiens l'erreur suivante:
"cat: /etc/os-release/: Aucun fichier ou dossier de ce type"
Le dossier existe bien sur la machine distante, et quand j’exécute la commande en direct sans passer par une connexion SSH, elle fonctionne correctement.
Quelqu'un a-t-il une idée?
Merci