Commande via ssh

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 :

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

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.

C’est bon j’ai trouvé la solution à mon problème :041 ! 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.

Ca pourra toujours servir a quelqu’un d’autre :wink:

Par contre tu pourrais donner la solution :mrgreen:

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

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

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.