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

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 12: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 13:53:40)

Hors ligne

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

Croutons
Membre
Distrib. : Debian12
Noyau : Linux 6.1.0-13-amd64
(G)UI : Fluxbox(NakeDeb)
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

En ligne

#3 18-11-2022 13: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 20:28:45

Croutons
Membre
Distrib. : Debian12
Noyau : Linux 6.1.0-13-amd64
(G)UI : Fluxbox(NakeDeb)
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

En ligne

#5 18-11-2022 23: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 (18-11-2022 23: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 !

En ligne

#6 18-11-2022 23:38:01

saitama-san
Membre
Distrib. : stable
(G)UI : gnome
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 08:41:52

Croutons
Membre
Distrib. : Debian12
Noyau : Linux 6.1.0-13-amd64
(G)UI : Fluxbox(NakeDeb)
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

En ligne

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

saitama-san
Membre
Distrib. : stable
(G)UI : gnome
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

#9 18-01-2023 22:11:35

Yoca
Membre
Distrib. : Debian
Noyau : Linux 5.10.0-20-amd64
(G)UI : Xfwm4
Inscription : 15-01-2023

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

Je sens que je vais me prendre un carton rouge car je ne réponds pas directement au problème, mais as tu pensais à l'outillage ansible? Ça utilise le protocole ssh et permet notamment d'identifier les serveur distant UP ou down.

OS: Debian GNU/Linux 11 (bullseye) x86_64
Host: Aspire V5-591G V1.05
DE: Xfce 4.16 
Terminal: terminator

Hors ligne

#10 22-01-2023 12:33:51

gregern
Membre
Inscription : 06-05-2017

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

Carton rouge ^^
J'ai pas mon pc sous la main mais j'ai trouvé depuis, la solution.
Merci à vous en tout cas!
(Je peux la partager si vous voulez).

Hors ligne

#11 22-01-2023 19:30:57

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

Bah oui partage la, le principe est là wink

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 !

En ligne

#12 22-01-2023 20:53:51

Yoca
Membre
Distrib. : Debian
Noyau : Linux 5.10.0-20-amd64
(G)UI : Xfwm4
Inscription : 15-01-2023

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

Arf je m'en doutais. Oui partage la solution.

OS: Debian GNU/Linux 11 (bullseye) x86_64
Host: Aspire V5-591G V1.05
DE: Xfce 4.16 
Terminal: terminator

Hors ligne

#13 27-01-2023 15:40:09

gregern
Membre
Inscription : 06-05-2017

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

Servers_Hostname="$(cat /path/to/server_list.txt)"
SshCmd="timeout ${Timeout} ssh -i ${SshKey} -n -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null"
SshUsr="root"
Csv_File="/path/to/data.csv"
for SrvDst in ${Servers_Hostname}
        do

                ${SshCmd} "${SshUsr}"@"${SrvDst}" "cat /${SshUsr}/.ssh/authorized_keys | while read line ; do echo -e \"$SrvDst;\"\$line|sed 's/$/;/'; done"
        done > "$Csv_File"

Hors ligne

#14 27-01-2023 17:46:23

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

Bah, j'aurais plutôt écrit ceci pour le même résultat :

Servers_Hostname="/path/to/server_list.txt"
Csv_File="/path/to/data.csv"
SshUsr="root"
SshCmd="timeout $Timeout ssh -i $SshKey -n -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null"

while read -r SrvDst
do
   $SshCmd  "${SshUsr}@$SrvDst" "while read -r line ; do echo -e \"$SrvDst;\$line;\" ; done < /$SshUsr/.ssh/authorized_keys"
done < "$Servers_Hostname" > "$Csv_File"




Edit:
Quelques corrections ...
Et tu devrais utiliser shellcheck.
Je te conseille aussi cette lecture : https://frederic-lang.developpez.com/tu … rog-shell/

Dernière modification par Tawal (27-01-2023 18:14:13)


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 !

En ligne

Pied de page des forums