# Commande via ssh

**URL:** <https://www.debian-fr.org/t/commande-via-ssh/55478>\
**Category:** Programmation\
**Created:** [Février 21, 2016, 1:38 UTC](https://www.debian-fr.org/t/commande-via-ssh/55478 "2016-02-21T13:38:42Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![LeehN](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/l/b19c9b/32.png) [@LeehN](https://www.debian-fr.org/u/LeehN)\
**Post date:** [Février 21, 2016, 1:38 UTC](https://www.debian-fr.org/t/commande-via-ssh/55478/1 "2016-02-21T13:38:42Z")

</div>

Bonjour/soir,

Voici ma situation :

- J’ai plusieurs serveurs sous la main dont un “Principal” qui me permet de me connecter en root sur tous les autres par ssh sans avoir à taper de mdp
- Tout les serveurs on des instances/cluster mysql

Je dois créer sur tte ces instances un nvlle utilisateur avec certains droits.  
Etant donnée la très grande quantité d’instances mon idée à donc été de faire un script pour automatiser cette création.

Toutes les instances ont le même chemin pour y accéder.  
Exemple :

- Sur le serveur 1 :  
/data/instance1/truc/bin/mysql -u root -p### --socket=/var/run/instance1/instance1.sock --port=####  
/data/instance2/truc/bin/mysql -u root -p### --socket=/var/run/instance2/instance2.sock --port=####  
/data/instance3/truc/bin/mysql -u root -p### --socket=/var/run/instance3/instance3.sock --port=####

serveur 2 idem, 3 idem etc…

Mon avancement :

Alors depuis le serveur “Principal” :  
j’ai fais un script avec un find qui me récupere ttes les instances sur chaques serveurs étant données qu’ils n’ont pas tous les mêmes noms d’instances sauf certains et un grep qui me récupère les ports dans un fichier de conf. (ils sont tous les 2 stockers dans des variables différentes).

ce qui donne un truc du genre

[code]clear  
echo "Entrez une IP : "  
read IP

ssh ${IP} ‘bash -c “find /data/ ( -name “instance?” -o -name “instance?” -o #etc…) -printf %f\\n”’ \> /data/Test/instances[/code]  
Ce qui va me créer un fichier instance sous mon serveur Principal avec la liste des instances trouvées.

Ensutie avec une boucle while read je récupère ces infos que je stock dans un tableau. $instance[$i] par exemple, i étant le numéro de ligne.

Je récupère et stock le ports

`Port=`ssh ${IP} "bash -c 'grep -A 0 Port= /data/${instance[$i]}/config/.my.conf | cut -c6-'"`
`

Et maintenant c’est là où je bloque (à mon avi c’est tout bête), à l’éxécution de la commande :

```auto

```

Je pense que c’est un soucis avec les quotes… Mais je vois pas trop comment faire.

Si quelqu’un a une idée pour résoudre mon problème je prends !  
Si vous avez d’autres idées plus rapide et simple pour faire ce que je veux faire je prends aussi !

Merci.

Cordialement,  
LeehN

---

<div class="post-metadata">

**Author:** ![Mimoza](https://www.debian-fr.org/user_avatar/www.debian-fr.org/mimoza/32/3858_2.png) [@Mimoza](https://www.debian-fr.org/u/Mimoza)\
**Post date:** [Février 21, 2016, 1:39 UTC](https://www.debian-fr.org/t/commande-via-ssh/55478/2 "2016-02-21T13:39:06Z")

</div>

Ce n’est pas la solution que tu cherche mais une voie à explorer.  
Au lieu de tout mettre dans une seule ligne de commande il existe un moyen de passer des commandes à un outil.  
L’exemple que j’ai le plus souvent rencontré est avec Oracle et l’outil sqlplus :

`sqlplus -s /nolog <<EOF
connect / as sysdba
startup mount
alter database open;
exit;
EOF`

Tout ce qui se trouve entre les “EOF” est passésà sqlplus comme si c’était tapé au clavier. Le marqueur “EOF” peut être remplacé par n’importe quoi, “toto” si ça te fait plaisir.  
Je pense que tu y gagneras beaucoup en lisibilité.  
NB : Évite l’indentation dans le bloc de commande, ça ne sert à rien et peut introduire des problèmes.

---

<div class="post-metadata">

**Author:** ![LeehN](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/l/b19c9b/32.png) [@LeehN](https://www.debian-fr.org/u/LeehN)\
**Post date:** [Février 21, 2016, 1:39 UTC](https://www.debian-fr.org/t/commande-via-ssh/55478/3 "2016-02-21T13:39:09Z")

</div>

C’est bon j’ai trouvé la solution à mon problème ![:041](https://www.debian-fr.org/uploads/default/original/1X/bfe857c9119752799c3eac55ca37a50312c51282.gif "applaudit") ! Ce n’était pas compliqué, je cherchais trop à me compliquer la vie…

Merci en tout cas de m’avoir répondu assez vite même si ça m’a pas trop aidé dans mon cas.

LeehN.

---

<div class="post-metadata">

**Author:** ![Mimoza](https://www.debian-fr.org/user_avatar/www.debian-fr.org/mimoza/32/3858_2.png) [@Mimoza](https://www.debian-fr.org/u/Mimoza)\
**Post date:** [Février 21, 2016, 1:39 UTC](https://www.debian-fr.org/t/commande-via-ssh/55478/4 "2016-02-21T13:39:10Z")

</div>

Ca pourra toujours servir a quelqu’un d’autre 😉

Par contre tu pourrais donner la solution ![:mrgreen:](https://www.debian-fr.org/uploads/default/original/1X/cc83e9b583138e48ff45f96609046b06d06c7f9d.gif "Mr. Green")

---

<div class="post-metadata">

**Author:** ![LeehN](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/l/b19c9b/32.png) [@LeehN](https://www.debian-fr.org/u/LeehN)\
**Post date:** [Février 21, 2016, 1:39 UTC](https://www.debian-fr.org/t/commande-via-ssh/55478/5 "2016-02-21T13:39:16Z")

</div>

Ouep je comptais donner la solution aujourd’hui, je n’ai pas eu le temps hier 🙂

Alors ce que j’ai fait c’est de créer un 1er script qui demande de saisir une adresse IP et qui éxécute un autre script sur le serveur distant en ssh.

Ce qui donne ça :

1er script :

`clear
echo "Entrez l'IP : "
read IP
ssh ${IP} bash < ./Add_users.sh
`

2nd script : Add\_users.sh

```auto

```

cette commande va chercher tous les “trucmuch” et afficher le résultat sous la forme d’un fichier “TrucmuchList” sur le serveur distant avec des retour à la ligne entre chaque résultat.

`i=1
j=1
while read aLine
do
trucmuch[$i]=$aLine
i=$(($i+1))
done < /data/TrucmuchList`  
On va lire ce fichier et sauvegarder les résultats dans un tableau trucmuch[$i]

`while test $j != $i
do
echo "${trucmuch[$j]}"
grep -A 0 Port= /data/${trucmuch[$j]}/config/my.conf | cut -c6-
/data/${trucmuch[$j]}/bin/mysql -u root -pMonMDP --socket=/var/run/${trucmuch[$j]}.sock --port=${Port} -e "GRANT SELECT, INSERT, UPDATE, CREATE, RELOAD, SHUTDOWN, #ETC..., TRIGGER ON *.* TO 'NomCompte'@'%' IDENTIFIED BY 'LeMDP';GRANT SELECT, INSERT, UPDATE, CREATE, RELOAD, SHUTDOWN, PROCESS, #ETC..., TRIGGER ON *.* TO 'NomCompte'@'localhost' IDENTIFIED BY 'LeMDP';"
j=$(($j+1))`  
Pour finir, dans une boucle, on va chercher le Port dans le fichier de conf de chaque trucmuch et ensuite on va éxécuter la commande pour lancer mysql suivis d’un “-e” pour directement éxécuter ma requete.

Voilà, si j’ai pas été clair dites le moi.

Edit : trucmuch correspond aux noms de mes instances.
