Debian Debian-France Debian-Facile Debian-fr.org Forum-Debian.fr Debian ? Communautés

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#1 18-11-2022 13:06:33

gregern
Membre
Inscription : 06-05-2017

lire un fichier ligne par ligne et utiliser la ligne dans un script

Bonjour,

j'ai un fichier contenant des hostname fqdn de machines dans un réseau.
le script doit lire ce fichier dans le but de se connecter à chaque machines présentes dans le fichier.
une fois connecté au server, il va y traiter des commandes.

#!/bin/bash

#include colors
. "$(dirname "$0")"/colors.txt


#vars
DATE="$(date)"
TIMEOUT="10"
FQDN=$(hostname --fqdn)
SSHKEY="/account/.ssh/cle_publique"

SSHOPT="timeout ${TIMEOUT} ssh -i ${SSHKEY} -n -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null"
SSHUSR="account"
DSTSRV="$(cat ./server_list.txt)"



#se connecter dans chaque server de la liste et faire le check
        while read ${DSTSRV[@]}
        do
                if ssh -i ${SSHKEY} ${SSHUSR}@${DSTSRV[@]}  "if [ -s \"${X}/.ssh/authorized_keys\" ]" > /dev/null 2>&1;then
                        echo "$Green### ${FQDN} ------ ${X}/.ssh/authorized_keys : ###$Nc"
                        sed -e "/^ssh.*/i \\\n# Last seen $DATE # --$Lblue  Human Key$Nc" -e "/.*==.*/i \\\n# Last seen $DATE # -- $Yellow Service Key$Nc" "${X}/.ssh/authorized_keys"
                else
                        error=1
                fi
        done < <(timeout ${TIMEOUT} ssh -i ${SSHKEY} -n -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null ${SSHUSR}@${DSTSRV[@]} "cat /etc/passwd | cut -d ':' -f6 | sort | uniq" )




voici la sortie :

++ timeout 10 ssh -i /root/.ssh/id-ed25519_gernoult -n -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null account@machine1.fqdn account@machine2.fqdn account@machine3.fqdn account@machine4.fqdn account@machine5.fqdn 'cat /etc/passwd | cut -d '\'':'\'' -f6 | sort | uniq'
./prog.sh: line xx: read: `account@machine1.fqdn': not a valid identifier




En fait mon problème que je souhaite solutionner est que la commande SSH incrémente toute les machines sur lesquelles il faut se connecter en meme temps.
Normalement il devrait faire séquentiellement :

timeout 10 ssh -i /root/.ssh/id-ed25519_gernoult -n -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null account@machine1.fqdn 'cat /etc/passwd | cut -d '\'':'\'' -f6 | sort | uniq'



puis


timeout 10 ssh -i /root/.ssh/id-ed25519_gernoult -n -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null account@machine2.fqdn 'cat /etc/passwd | cut -d '\'':'\'' -f6 | sort | uniq'




etc..


Est-ce que quelqu'un pourrait me filer un tips pour que ca fonctionne comme cela? (et en meme temps, je m'endormirais moins c*n ce soir^^)

Merci!

Dernière modification par gregern (18-11-2022 14:53:40)

Hors ligne

#2 18-11-2022 14:09:39

Croutons
Membre
Distrib. : Debian10 Buster
Noyau : Linux 4.19.0-18-amd64
(G)UI : Mate
Inscription : 16-12-2016

Re : lire un fichier ligne par ligne et utiliser la ligne dans un script

Hello
Si tu pouvais utiliser les balises du forum quand tu poste du code se serait plus lisible et cela donnerait envie de se pencher sur le problème
y'en a des pipe les un a la suite des autres , déja en utilisant l'option --unique de sort ça le ferait mieux big_smile

-->les cahiers du debutant<--      WikiDF-->Découvrir les principales commandes Linux<--
L' expérience, c'est le nom que chacun donne à ses erreurs. Oscar Wilde

Hors ligne

#3 18-11-2022 14:54:05

gregern
Membre
Inscription : 06-05-2017

Re : lire un fichier ligne par ligne et utiliser la ligne dans un script

@Croutons oui pardon, , voilà j'ai update mon message

Hors ligne

#4 18-11-2022 21:28:45

Croutons
Membre
Distrib. : Debian10 Buster
Noyau : Linux 4.19.0-18-amd64
(G)UI : Mate
Inscription : 16-12-2016

Re : lire un fichier ligne par ligne et utiliser la ligne dans un script

rien de sur mais ce serait pas le cat qui ne va pas pour la boucle while?
essai plutôt

cut -d ':' -f6 /etc/passwd|sort --unique


-->les cahiers du debutant<--      WikiDF-->Découvrir les principales commandes Linux<--
L' expérience, c'est le nom que chacun donne à ses erreurs. Oscar Wilde

Hors ligne

#5 19-11-2022 00:03:48

Tawal
Membre
Distrib. : Debian Stable à jour
Noyau : amd64
(G)UI : Xfce
Inscription : 25-02-2021

Re : lire un fichier ligne par ligne et utiliser la ligne dans un script

Hello,

Il y a beaucoup d'aberrations dans ton script.

Si je comprends bien ce que tu veux faire :
- lire ligne par ligne un fichier
- lancer un groupe de commandes en utilisant la ligne lue
Si c'est bien cela, je corrigerais comme ceci :

#!/bin/bash

#include colors
. "$(dirname "$0")"/colors.txt


#vars
DATE="$(date)"
TIMEOUT="10"
FQDN=$(hostname --fqdn)
SSHKEY="/account/.ssh/cle_publique"

# Aucune reférence à cette variable dans le script !!!
# SSHOPT="timeout ${TIMEOUT} ssh -i ${SSHKEY} -n -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null"
SSHUSR="account"
#DSTSRV="$(cat ./server_list.txt)"   <== ce n'est pas un tableau, c'est une chaîne de caractères.
#Et c'est aussi un UUOC (cf. ma signature), on assigne plutôt ainsi : chaine="$(< ./server_list.txt)"



#se connecter dans chaque server de la liste et faire le check
while read -r DSTSRV    # la variable DSTSRV prend tour à tour la valeur de la ligne lue dans ./server_list.txt
                         # voir le done de fin de boucle
do

# Cette partie est incompréhensible !!!
# Le sed n'a pas de fichier d'entrée
# Si le if échoue alors error=1, mais aucune référence à error (ni test dessus ...)
# Explique ce que tu veux faire.
#
#   if ssh -i ${SSHKEY} ${SSHUSR}@${DSTSRV[@]}  "if [ -s \"${X}/.ssh/authorized_keys\" ]" > /dev/null 2>&1;then
#      echo "$Green### ${FQDN} ------ ${X}/.ssh/authorized_keys : ###$Nc"
#      sed -e "/^ssh.*/i \\\n# Last seen $DATE # --$Lblue  Human Key$Nc" -e "/.*==.*/i \\\n# Last seen $DATE # -- $Yellow Service Key$Nc" "${X}/.ss>
#   else
#      error=1
#   fi

   timeout "$TIMEOUT" ssh -i "$SSHKEY" -n -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null "$SSHUSR"@"$DSTSRV" "cat /etc/passwd | cut -d ':' -f6 | sort | uniq"

done < ./server_list.txt



Edit:
Ne connaissant rien à ssh, je ne contrôle que la syntaxe du script.
Ceci est aussi un UUOC :

cat /etc/passwd | cut -d ':' -f6 | sort | uniq


La bonne forme est :

cut -d ':' -f6 /etc/passwd | sort -u

Dernière modification par Tawal (19-11-2022 00:38:08)


Comme la science n'est pas infuse, elle se diffuse.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

#6 19-11-2022 00:38:01

saitama-san
Membre
Inscription : 28-07-2019

Re : lire un fichier ligne par ligne et utiliser la ligne dans un script

il existe aussi pssh
https://cbiot.fr/dokuwiki/pssh

Hors ligne

#7 19-11-2022 09:41:52

Croutons
Membre
Distrib. : Debian10 Buster
Noyau : Linux 4.19.0-18-amd64
(G)UI : Mate
Inscription : 16-12-2016

Re : lire un fichier ligne par ligne et utiliser la ligne dans un script

apt install shellcheck


c'est pas mal pour voir les erreurs dans un script
genre les espace manquant après une parenthèse, toute erreurs de syntaxe
c'est pas toujours pertinent , mais dans l'ensemble c'est plutôt bien


-->les cahiers du debutant<--      WikiDF-->Découvrir les principales commandes Linux<--
L' expérience, c'est le nom que chacun donne à ses erreurs. Oscar Wilde

Hors ligne

#8 19-11-2022 13:06:17

saitama-san
Membre
Inscription : 28-07-2019

Re : lire un fichier ligne par ligne et utiliser la ligne dans un script

regarde https://lipn.univ-paris13.fr/~cerin/SE/ … hell2.html
pour ssh, je conseillerai de mettre les options utiles dans ~/.ssh/config plutôt que de surcharger le script.

sinon, shellcheck c'est une bonne habitude

Hors ligne

Pied de page des forums