Connexion serveur mysql via un script bash

Fermé
xunil2003 Messages postés 761 Date d'inscription mercredi 17 novembre 2004 Statut Membre Dernière intervention 24 mars 2024 - 6 oct. 2013 à 20:54
mamiemando Messages postés 33088 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 30 avril 2024 - 9 oct. 2013 à 01:17
Bonjour,

Je cherche le moyen d'insérer une entrée SQL sur la base de donnée mysql de mon serveur local depuis n'importe quel poste fixe de mon réseau local avec un script bash.

Pour insérer une entrée SQL via ssh je m'y pend comme ceci :
    login_db="root"
pass_bd="xxxxxx"
colonne="id, date, poid"
nom_bd="regime"
nom_table="$nom_client"

echo 'mysql -u '$login_db' -h '$hote_db' -p'$pass_bd' -D '$nom_bd' "INSERT INTO '$nom_table' (id,date,poid) VALUES ('','$valeur2','$valeur3')"' | sshpass -p $pass_serveur ssh serveur@192.168.0.1

Mais ce n'est pas bon, il ne trouve pas la bd.

ERROR 1049 (42000): Unknown database 'INSERT INTO Laurent (id,date,poid) VALUES (,05/10/2013,92.10)'

Comment dois-je procéder via ssh ?
Merci.


1 réponse

mamiemando Messages postés 33088 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 30 avril 2024 7 751
9 oct. 2013 à 01:17
Il manque l'option -e devant ta commande SQL non ?

mysql -u '$login_db' -h '$hote_db' -p'$pass_bd' -D '$nom_bd' -e '$sql'

Ensuite tu parles d'une connexion ssh mais c'est un peu paradoxal, car tu sembles faire une authentifcation mysql distante, du coup de deux choses l'une :

1) soit tu te connectes à ton serveur via ssh, et cette commande ssh transporte une commande shell qui déclenche la commande mysql. Comme tout se passe comme si tu étais connecté localement à ce serveur, a priori ta connexion mysql sera faite vers 127.0.0.1 (localhost) et ça devient :

ssh login@server "mysql -u '$login_db' -p'$pass_bd' -D '$nom_bd' -e '$sql'"

2) ou alors tu crées un tunnel ssh et tu fais la connexion ssh au travers de ce tunnel.

Il y a sans doute d'autres stratégies mais ce sont les deux seules qui me viennent. Notamment mysql permet des authentifications basées sur X509 pour établir des connexions sécurisées.

Compléments sur (2)

L'avantage est qu'une fois établi, le tunnel peut être utilisé de manière transparente (comprendre : pas besoin de s'authentifier à chaque fois qu'on le traverse), mais j'opterais quand même pour la solution précédente avec une clé ssh dans ton cas. Pour info voici comment faire un tunnel qui écoute localement sur le port 3307 et qui va transporter les informations au travers de la connexion "ssh login@server", avec server une machine qui a un serveur mysql qui écoute sur le port 3306 :

ssh -T -N -L 3307:localhost:3306 login@server
mysql -h 127.0.0.1 -P 3307 -u $login_db -p -D '$nom_bd' -e '$sql'

Mais je ne suis pas trop fan de cette approche, car on n'a pas trop de garantie sur qui peut emprunter ce tunnel. Bref.

Compléments sur (1)

Revenons à la solution (1) et rendons-la plus pratique. Son principal inconvénient, c'est que tu n'as pas forcément envie de devoir taper le mot de passe ssh à chaque fois que tu lances ton script. Pour cela, il suffit de s'authentifier en ssh non pas avec un mot de passe, mais avec une clé ssh :
http://prendreuncafe.com/blog/post/2005/08/29/262-installer-sa-cle-ssh-sur-un-serveur-distant

Une fois la clé opérationnelle, il suffit de la "charger" en la référençant auprès de ssh-agent typiquement avec la commande
ssh-add
.

Quelle que soit la stratégie reçue

De manière générale on essaye de limiter autant que possible les moyens de se connecter à un serveur. À partir du moment où les seules connexions mysql "extérieures" arrivent au travers d'une connexion ssh, tout se passe pour ton serveur comme si elles étaient locales. Du coup, plus de raison que ton serveur mysql écoute les connexions extérieures. Ceci se traduit à deux niveaux

1) Au niveau des comptes utilisateurs : tu n'as plus de raison que le compte mysql $login_db ait le droit de se connecter autrement qu'en local (en d'autre termes, le compte '$login_db'@'localhost' devrait être le seul à être configuré au niveau mysql).
http://dev.mysql.com/doc/refman/5.0/fr/adding-users.html

2) Au niveau du serveur (voir /etc/mysql/my.cnf) ta bind-address devrait dès lors être initialisée à 127.0.0.1 (pour n'écouter que le trafic local) et non 0.0.0.0 (qui signifie que mysql écoute aussi le trafic extérieur). Pense à relancer mysql ensuite :

service mysql restart

Bonne chance
2