web-dev-qa-db-fra.com

Connectez-vous à un serveur MySQL via SSH dans PHP

j'ai lu un article sur ce sujet, je veux aussi faire la même chose,

j'ai ma base de données sur la machine linux distante, et je veux me connecter en utilisant ssh et php funcitons, (j'utilise actuellement la bibliothèque ssh2 pour cela) J'ai essayé d'utiliser mysql_connect, autorisation accordée) lorsque j’ai essayé d’utiliser cette fonction:

$connection = ssh2_connect('SERVER IP', 22);

ssh2_auth_password($connection, 'username', 'password');

$tunnel = ssh2_tunnel($connection, 'DESTINATION IP', 3307);

$db = mysqli_connect('127.0.0.1', 'DB_USERNAME', 'DB_PASSWORD', 
                         'dbname', 3307, $tunnel)
    or die ('Fail: '.mysql_error());

j'ai l'erreur "mysqli_connect () s'attend à ce que le paramètre 6 soit une chaîne, ressource donnée", quelqu'un peut-il m'aider s'il vous plait

17
spooja

Essaye ça:

Étape 1.  

Pour configurer une connexion SSH en tunnel avec un serveur MySQL sur remotehost.com

ssh -fNg -L 3307: 127.0.0.1: 3306 [email protected]

La clé ici est -L qui indique que nous effectuons un transfert de port local. 

Syntaxe de frowarding de port local
La syntaxe est un peu délicate mais peut être vue comme:

<local_port>:<server_addr_remote_end>:<server_port_remote_end> [email protected] 

Si vous êtes intéressé par les autres commutateurs, ils sont: - f (aller en arrière-plan) - N (ne pas exécuter de commande à distance) - g (autoriser hôtes pour se connecter aux ports redirigés locaux) 

Authentification par clé publique, ajoutez (-i) le commutateur ci-dessus:

-i/chemin/à/public/clé

Étape 2.

Indiquez maintenant au client MySQL local de se connecter au port 3307 de votre machine (qui est transféré via ssh en tant que connexion à "127.0.0.1:3306" sur remotehost.com) via la configuration du tunnel SSH à l’étape 1.

mysql -h 127.0.0.1 -P 3307 -u dbuser -p phrase secrète

L'échange de données entre le client et le serveur est maintenant envoyé via la connexion ssh cryptée et est sécurisé.

Étape 3.

Maintenant connectez votre application PHP avec:

<?php
      $smysql = mysql_connect( "127.0.0.1:3307", "dbuser", "passphrase" );
      mysql_select_db( "db", $smysql ); 
?>

Nous remercions Chris Snyder pour son excellent article sur http://chxo.com/be2/20040511_5667.html

Outils d'interface graphique

Selon vos besoins, une autre solution consisterait à utiliser un client graphique MySQL avec prise en charge du tunnel SSH, tel que http://www.sequelpro.com/ ou à utiliser PuTTY pour configurer le transfert de port.

UPDATE 1 Aujourd’hui, j’ai passé en revue un outil de tunneling ssh alternatif et viable pour l’interface graphique MacOS appelé secure pipes que vous jugerez peut-être utile.

31
Tony Barganski

Malheureusement, le tunnel ssh2 proposé par php ne semble pas capable de gérer une connexion mysql distante car vous ne pouvez pas spécifier le port local à tunnel (il ne fonctionne qu'avec le port 22 ou le port ssh de votre serveur distant). Ma solution à cela est simplement d'ouvrir le tunnel via l'opérateur exec() et de vous connecter comme d'habitude à partir de là:

exec('ssh -f -L 3307:127.0.0.1:3306 [email protected] sleep 10 > /dev/null');
$mysqli = new mysqli('127.0.0.1', 'user', 'password', 'database', '3307');
1
billynoah

Selon les documents , ce dernier paramètre est censé être un nom de socket ou de tuyau, quelque chose comme '/var/run/mysql/mysql.sock'. Puisque vous ne vous connectez pas à l'aide d'une prise UNIX, cela ne vous concerne pas ... essayez donc de le laisser de côté.

1
David Z

même si je l'ai essayé en faisant ssh à la fois avec les informations d'identification de racine et avec la paire de clés privée publique, mais cela me permet de me connecter via la ligne de commande mais pas via le code php. J'ai essayé en créant également un tunnel (en utilisant les fonctions ssh2), en exécutant les commandes Shell à partir du code php (système, exec, etc.), rien n'a fonctionné. Enfin, j’ai essayé la fonction ssh2 pour exécuter la commande Shell et cela a finalement fonctionné :) Voici du code, s’il vous aide: ----

$connection = ssh2_connect($remotehost, '22');
if (ssh2_auth_password($connection, $user,$pass)) { 
    echo "Authentication Successful!\n";
} else {
    die('Authentication Failed...');
}

$stream=ssh2_exec($connection,'echo "select * from zingaya.users where id=\"1606\";" | mysql');
stream_set_blocking($stream, true);
while($line = fgets($stream)) { 
    flush();
    echo $line."\n";
}

cela a fonctionné pour moi essayez ceci si vous voulez utiliser les fonctions php spécifiquement.

0
spooja

Je crois que la raison pour laquelle j'ai (et je suppose que la plupart des gens) un problème pour que cela fonctionne est que l'utilisateur du serveur mysql est configuré pour autoriser uniquement "localhost" et non 127.0.0.1, l'adresse IP de localhost.

J'ai obtenu ce travail en procédant comme suit:

Étape 1: Autoriser l'hôte 127.0.0.1 pour l'utilisateur cible

SSH normalement sur votre serveur, et connectez-vous avec l'utilisateur root mysql, puis lancez la commande:

GRANT ALL ON yourdbname.* TO [email protected] IDENTIFIED BY 'yourdbpassword';

La clé bien sûr, spécifiant 127.0.0.1 ci-dessus.

Étape 2: démarrez le tunnel SSH local vers MySQL

Vous pouvez maintenant démarrer votre tunnel SSH local sur le serveur MySQL distant, comme suit:

ssh -vNg -L 33306:127.0.0.1:3306 [email protected]

-v permet à ssh de fonctionner en mode verbeux, ce qui aide à voir ce qui se passe. Par exemple, vous verrez une sortie de débogage comme celle-ci dans votre console Terminal lorsque vous tentez une connexion:

debug1: client_input_global_request: rtype [email protected] want_reply 0
debug1: Connection to port 33306 forwarding to 127.0.0.1 port 3306 requested.

et sortez comme ceci quand vous fermez la connexion:

debug2: channel 2: is dead
debug2: channel 2: garbage collecting
debug1: channel 2: free: direct-tcpip: listening port 33306 for 127.0.0.1 port 3306, connect from 127.0.0.1 port 52112 to 127.0.0.1 port 33306, nchannels 3

-N fait en sorte que ssh n’émette aucune commande et attend juste après l’établissement de la connexion.

-g permet aux hôtes distants de se connecter aux ports redirigés locaux. Pas tout à fait sûr que cela soit nécessaire, mais cela pourrait être utile pour multiplexer plusieurs connexions via le même tunnel SSH.

-L Ceci est le paramètre principal qui spécifie le port local 33306 pour se connecter à l'adresse IP locale de l'hôte distant 127.0.0.1 et au port mysql de l'hôte distant, généralement 3306.

Vous pouvez utiliser les mécanismes/autres paramètres nécessaires par la suite pour vous connecter via SSH à votre hôte distant. Dans mon cas, j’utilise les fichiers de clés configurés dans mon ~/.ssh/config. Il me suffit donc de spécifier user@Host pour entrer.

Émettre la commande comme ceci exécute SSH au premier plan, donc je peux facilement le fermer avec Ctrl + C. Si vous souhaitez exécuter ce tunnel dans un processus en arrière-plan, vous pouvez ajouter -f pour ce faire.

Étape 3: connectez-vous à partir de PHP/d'autres méthodes compatibles avec mysql

Le tunnel SSH partant du haut sur votre hôte local se comportera exactement comme si votre mysql fonctionnait sur 127.0.0.1. J'utilise le port 33306 (remarquez le triple 3) qui me permet de faire fonctionner mon serveur SQL local sur son port normal. Vous pouvez maintenant vous connecter comme vous le feriez normalement. La commande mysql sur le terminal ressemble à ceci:

mysql -h 127.0.0.1 -P 33306 -u yourmysqluser -p

-P (P majuscule) spécifie le port où l'extrémité locale de votre tunnel SSH accepte les connexions. Il est important d’utiliser l’adresse IP 127.0.0.1 au lieu de localhost car le mysql cli essaiera éventuellement d’utiliser le socket linux pour se connecter.

Pour PHP chaînes de connexion, ma chaîne de nom de source de données (pour ma configuration Yii2) ressemble à ceci:

'dsn' => 'mysql:Host=127.0.0.1;dbname=yourdbname;port=33306',

Les mots de passe et les noms d'utilisateur sont spécifiés normalement.

0
Dhiraj Gupta

Assurez-vous que votre nom d'utilisateur et votre mot de passe avec lesquels vous vous connectez disposent des autorisations de nom d'hôte appropriées. Je crois que vous pouvez utiliser '%' pour un caractère générique. De plus, si vous vous connectez à une machine distante (ce qui, je suppose, si vous essayez de ssh) n'est pas sur votre réseau local, vous devrez transférer les ports de votre routeur où le serveur est destiné au trafic extérieur capable de se connecter à elle.

http://www.lanexa.net/2011/08/create-a-mysql-database-username-password-and-permissions-from-the-command-line/

0
robert thornton