Contenu | Rechercher | Menus

Annonce

DVD, clés USB et t-shirts Ubuntu-fr disponibles sur la boutique En Vente Libre

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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.
Linux user 449594

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 smile

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 &)

cool


antiX 19 (Debian Buster) et (L)Ubuntu focal 20.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.


Jusqu'à 100% d'économies avec le Green Friday !

Hors ligne

#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.


Jusqu'à 100% d'économies avec le Green Friday !

Hors ligne

#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 ! tongue

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