#1 Le 14/10/2021, à 13:01
- Moijerem31
execution de commande ssh non bloquante
Bonjour a vous tous .
Dans un script je lance des commande via ssh sur plusieurs ip définit ,
J'aimerais que cela s'enchaine de façon rapide , alors que pour le moment cela s’exécute de façon chronophage .
Merci pour votre aide
date
timeout=1
exec > /tmp/resultlogs/`date +%Y-%m-%d-%H-%M`-Result
for ip in 192.168.{1..9}.{1,3,4,5,7,8,10,12}
do
echo "<ip>${ip}</ip>";
ssh -o ConnectTimeout=$timeout user@${ip} "command execution ";
done
for ip in 192.168.{10..12}.{1,3,4,5,7,8,10,12}
do
echo "<ip>${ip}</ip>";
ssh -o ConnectTimeout=$timeout user@${ip} "command execution";
done
Hors ligne
#2 Le 14/10/2021, à 13:41
- inbox
Re : execution de commande ssh non bloquante
Salut,
Je n'y connais quasiment rien en script. Une bonne idée serait de lancer plusieurs scripts en parallèle, un peu comme indiqué dans ce sujet.
A+
Un problème résolu ? Indiquez le en modifiant le titre du sujet.
Hors ligne
#3 Le 14/10/2021, à 13:48
- Moijerem31
Re : execution de commande ssh non bloquante
Merci effectivement je procède déjà de cette façon mais j'aimerais que ma boucle for soit la plus rapide possible
Dernière modification par Moijerem31 (Le 14/10/2021, à 13:49)
Hors ligne
#4 Le 14/10/2021, à 17:30
- Sciensous
Re : execution de commande ssh non bloquante
je tape peut-être à côté: mettre un & à la place du ; à la fin des lignes ssh
pour lancer les ssh en parallèle ?
(pense à mettre un espace avant le &)
antiX 19 et 21 et Ubuntu 20.04 et 22.04
( sous LXDE et gnome-shell )
Hors ligne
#5 Le 14/10/2021, à 17:52
- Zakhar
Re : execution de commande ssh non bloquante
Ce que tu cherches c'est xargs
Il permet de lancer plusieurs trucs en parallèle avec un/des paramètres en entrée.
Très pratique, mais avec la contrainte que les paramètres sont à la fin. Si la commande lancée a ses paramètres variables "au milieu" ça coûte juste un petit script.
Par contre comme ça va s'exécuter tout en parallèle, du moins du nombre de process que tu précises, la sortie par défaut est inutilisable si la commande affiche plusieurs lignes puisque tout va s'y mélanger, et il faut penser à rediriger si tu veux avoir le résultat.
Démo, j'ai créé 3 fichiers avec du contenu aléatoire :
$ ls file?
file1 file2 file3
$ ls file? | xargs -n1 -P3 md5sum
8761f91d4cb8ca8b7add569a10cc911e file1
687d4563ff6a4edf40e17712705ab318 file2
93603affe46a3b8da02f6a8997e7282e file3
J'obtiens le md5 des 3 qui est calculé "en parallèle" sur 3 process (-P 3)
Le -n1 dit à xarg de prendre un seul argument dans ce qu'il a dans l'entrée standard pour le rajouter à la commande spécifiée, en l'occurrence md5sum
Là on n'a pas besoin de rediriger car le résultat est une seule ligne, et il n'y a pas de mélange à l'intérieur de la ligne (propriété générique de stdout).
[Mon exemple est peut-être peu démonstratif parce qu'avec md5sum file? on obtient le même résultat affiché... mais si les fichiers sont gros, tu peux vérifier que c'est bien du parallélisme... après ça va se "sérialiser" au niveau du disque ou du réseau et le gain n'est pas toujours immense !]
Dernière modification par Zakhar (Le 14/10/2021, à 18:04)
"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)
Hors ligne
#6 Le 14/10/2021, à 21:13
- Zakhar
Re : execution de commande ssh non bloquante
Cela dit... vu le bout de script que tu nous montres, si l'objectif est de tester que le port 22 d'une machine du réseau local est ouvert, il y a de bien meilleurs outils pour ça : nmap.
Et une fois que tu as trouvé une telle machine, ensuite tu fais le ssh !
Dernière modification par Zakhar (Le 14/10/2021, à 21:14)
"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)
Hors ligne
#7 Le 15/10/2021, à 07:07
- bruno
Re : execution de commande ssh non bloquante
+1
Il faudrait expliquer ton objectif.
Parce que je ne vois pas comment une boucle qui envoie une commande en SSH à 108 machines pourrait être rapide, même avec un délai d'expiration de 1 seconde.
#8 Le 15/10/2021, à 07:35
- Moijerem31
Re : execution de commande ssh non bloquante
Tout d'abord merci pour vos réponses .
Je cherche a exécuter des commandes définit sur une liste d adresse ip connu .
Le but est bien de gagné du temps sur l exécution.
Mon ancien script listé toute les adresses IP .(exemple ci dessous )
Mais il nous arrive parfois de modifier les ip et la boucle for ip nous correspond bien pour définir rapidement le range des adresse ip
echo "eq1"; ssh -o ConnectTimeout=$timeout user@192.168.1.1 "umount /media/ssd1; umount /media/ssd2;sleep 1; fsck.ext4 -y /ssd1p1; sleep 1; fsck.ext4 -y /ssd1p2; sleep 1"
echo "eq2"; ssh -o ConnectTimeout=$timeout user@192.168.1.2 "umount /media/ssd1; umount /media/ssd2;sleep 1; fsck.ext4 -y /ssd1p1; sleep 1; fsck.ext4 -y /ssd1p2; sleep 1"
echo "eq3"; ssh -o ConnectTimeout=$timeout user@192.168.1.3 "umount /media/ssd1; umount /media/ssd2;sleep 1; fsck.ext4 -y /ssd1p1; sleep 1; fsck.ext4 -y /ssd1p2; sleep 1"
Dernière modification par Moijerem31 (Le 15/10/2021, à 07:42)
Hors ligne
#9 Le 15/10/2021, à 08:38
- bruno
Re : execution de commande ssh non bloquante
C'est un peu curieux comme façon de procéder…
Pour obtenir la liste des IP avec le port 22 ouvert :
nmap 192.168.1.0/24 -p22 --open -oG - | awk '/22\/open.*/{print $2}'
et faire la boucle sur cette liste.
#10 Le 16/10/2021, à 09:16
- Zakhar
Re : execution de commande ssh non bloquante
Après, il existent un truc magique qui s'appelle le "bail permanent" dans les protocoles DHCP. Ca permet justement que tes machines aient toujours la même IP locale.
Toutes les box ou routeurs dignes de ce nom proposent la fonctionnalité, et ça rend l'opération que tu tentes inutile puisque le IP sont alors fixées et ne changent plus !
D'où l'intérêt d'expliquer ton besoin et pas ta solution !
Mais je sais, c'est un art difficile de bien poser le "besoin" sans partir d'emblée dans une "solution" qui est une potentielle complexité inutile.
Dernière modification par Zakhar (Le 16/10/2021, à 09:18)
"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)
Hors ligne
#11 Le 16/10/2021, à 20:32
- LeoMajor
Re : execution de commande ssh non bloquante
salut,
parallel -v -P0 --nonall --sshloginfile /tmp/loginssh "umount /media/ssd1; umount /media/ssd2 ...."
cat /tmp/loginssh
ssh -4 titi@abc.com -p5688
ssh -6 toto@domain.tld -p22
pssh (parallel-ssh, ..) dans le même genre
pour le wan,
1/variante -a -a
parallel -v -a /tmp/hosts -a /tmp/ports -k --results /tmp/para.log 'nc -4z -i 1 -w 1 {1} {2}; [ "$?" -eq 0 ] && echo "ok, {1} accessible sur {2}"'
cat /tmp/hosts
forum.ubuntu-fr.org
blabla.com
cat /tmp/ports
80
83
81
22
Edit: Hors Sujet: variantes sur les injections
2/ -a ::::
parallel -a /tmp/hosts 'nc -4z -i 1 -w 1 {1} {2}; [ "$?" -eq 0 ] && echo "ok, {1} accessible sur {2}"' :::: <(echo -e "22\n80\n81\n443\n8080") #ok
3/:::: ::::
parallel 'nc -4z -i 1 -w 1 {1} {2}; [ "$?" -eq 0 ] && echo "ok, {1} accessible sur {2}"' :::: <(echo -e "forum.ubuntu-fr.org\ndebian.org\nwww.redhat.com\nno-ip.org") :::: <(echo -e "22\n80\n81\n443\n8080") #ok
parallel 'nc -4z -i 1 -w 1 {1} {2}; [ "$?" -eq 0 ] && echo "ok, {1} accessible sur {2}"' :::: <(printf "%s\n" 192.168.{0..9}.{1..254}) :::: <(echo -e "22\n2221") #ok
pour s'amuser
parallel --tag 'grep -i $USER {}; md5sum {}; realpath {}' ::: *.txt /etc/passwd
à l'envers
:~$ parallel --tagstring {2} '{2} "{1}"' ::: *.txt /etc/passwd :::: <(echo -e '/usr/bin/md5sum\n/usr/bin/sha1sum\n/usr/bin/sha256sum\n/usr/bin/sha512sum')
/usr/bin/md5sum 6b3a73228f0a6007cfecbbc510f5fdd2 bonjour.txt
/usr/bin/sha1sum 816c668bdf9ac03e98c32006c2e4f427518129f0 bonjour.txt
/usr/bin/sha256sum 226687317e22de775655c13a2bac8a0d03bcbb487547607e4927d0e4f11c7f25 bonjour.txt
/usr/bin/sha512sum 474a9c8c307d63947d6b582c8e104696bee3ab483a59c2541dda8b54161b33a101e29cb483d806c6e4683fa5dff01442bfec45765ae095b4b8120fe62aef84fc bonjour.txt
/usr/bin/md5sum 94baaad4d1347ec6e15ae35c88ee8bc8 fichier (1).txt
...
II/ Performance parallel ?
~$ serie(){ for ip in 192.168.{0..1}.{1..60}; do for port in 22 2244; do nc -4z -i 1 -w 1 "$ip" "$port"; [ "$?" -eq 0 ] && echo "ok, ${ip} accessible sur $port"; done; done; }
~$ time serie
ok, 192.168.1.3 accessible sur 2244
3m56.830s (cpu 16 cores)
3m54.329s (cpu 4 cores)
~$ para(){ parallel 'nc -4z -i 1 -w 1 {1} {2}; [ "$?" -eq 0 ] && echo "ok, {1} accessible sur {2}"' :::: <(printf "%s\n" 192.168.{0..1}.{1..60}) :::: <(echo -e "22\n2244") ;}
~$ time para
ok, 192.168.1.3 accessible sur 2244
0m59.868s (cpu 4 cores)
0m15.578s (cpu 16 cores)
Dernière modification par LeoMajor (Le 19/10/2021, à 15:19)
Hors ligne