Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用phpseclib库连接到mysql数据库_Php_Mysql_Shell_Vps_Phpseclib - Fatal编程技术网

使用phpseclib库连接到mysql数据库

使用phpseclib库连接到mysql数据库,php,mysql,shell,vps,phpseclib,Php,Mysql,Shell,Vps,Phpseclib,我已使用phpscelib库成功连接到我的VPS。现在我想连接到我的现有数据库。请帮助我完成此操作 <?php set_include_path(get_include_path() . PATH_SEPARATOR . 'phpseclib'); include('Net/SSH2.php'); $ssh = new Net_SSH2('192.ccc.ccc.ccc'); if (!$ssh->login('ccc', 'cccc')) { exit('Login Fail

我已使用phpscelib库成功连接到我的VPS。现在我想连接到我的现有数据库。请帮助我完成此操作

<?php
set_include_path(get_include_path() . PATH_SEPARATOR . 'phpseclib');

include('Net/SSH2.php');


$ssh = new Net_SSH2('192.ccc.ccc.ccc');
if (!$ssh->login('ccc', 'cccc')) {
exit('Login Failed');
}

echo $ssh->exec("I need to put MySql commands here");
?>

首先,允许该用户远程访问mysql不是更好吗?然而,我不知道你的理由

最常见的透明方式是创建ssh隧道。这可以通过两种不同的方式实现。如果mysql端口(3306)未在mysql机器上打开,则需要一个反向ssh隧道,该隧道必须由远程机器打开。登录mysql机器并发出以下命令:

ssh -R 12345:localhost:3306 user@php_machine -N
echo $ssh->exec('mysql -uUSER -pPASSWORD DATABASE -e "SQL COMMAND"');
如果mysql端口在远程机器上打开,则php机器可以打开隧道:

ssh -f user@mysql_machine -L 12345:mysql_machine:3306 -N
不管隧道是以何种方式创建的,PHP应用程序现在都可以使用PDO并连接到本地主机端口12345

$pdo = new PDO('mysql:host=localhost;port=12345;dbname=test', $user, $password);
所有车辆都将通过隧道加密


如果您只想发出几个简单的命令,可以使用以下替代方法

最简单但不安全的方法是使用以下命令:

ssh -R 12345:localhost:3306 user@php_machine -N
echo $ssh->exec('mysql -uUSER -pPASSWORD DATABASE -e "SQL COMMAND"');
这是不安全的,因为系统上的其他用户可以看到密码

您可以使用
expect
解决安全问题
expect
是一个可以以更安全的方式将密码传递给mysql的程序。确保远程系统上安装了
expect
。下面是一个在数据库
test
上使用
showtables
命令的示例:

include('Net/SSH2.php');

$ssh = new Net_SSH2('192.xxx.xxx.xxx');
if (!$ssh->login('ssh_user', 'ssh_password')) {
exit('Login Failed');
}

echo $ssh->exec('expect <<EOF
# disable command output
log_user 0
# start the mysqldump process
spawn mysql -uTHE_USER -p test -e "SHOW TABLES"
# wait for the password prompt
expect "password:"
# send the password (mind the \r)
send "THE_PASSWORD\r"
# enable output again
log_user 1
# echo all outout until the end
expect eof
EOF
');
include('Net/SSH2.php');
$ssh=newnetssh2('192.xxx.xxx.xxx');
if(!$ssh->login('ssh\u user','ssh\u password')){
退出(“登录失败”);
}

echo$ssh->exec('expect首先,允许该用户远程访问mysql不是更好吗?但是,我不知道你的原因

最常见的透明方式是创建ssh隧道。这可以通过两种不同的方式完成。如果mysql计算机上未打开mysql端口(3306),则需要远程计算机打开反向ssh隧道。登录mysql计算机并发出以下命令:

ssh -R 12345:localhost:3306 user@php_machine -N
echo $ssh->exec('mysql -uUSER -pPASSWORD DATABASE -e "SQL COMMAND"');
如果mysql端口在远程机器上打开,则php机器可以打开隧道:

ssh -f user@mysql_machine -L 12345:mysql_machine:3306 -N
不管隧道是以何种方式创建的,PHP应用程序现在都可以使用PDO并连接到本地主机端口12345

$pdo = new PDO('mysql:host=localhost;port=12345;dbname=test', $user, $password);
所有车辆都将通过隧道加密


如果您只想发出几个简单的命令,可以使用以下替代方法

最简单但不安全的方法是使用以下命令:

ssh -R 12345:localhost:3306 user@php_machine -N
echo $ssh->exec('mysql -uUSER -pPASSWORD DATABASE -e "SQL COMMAND"');
这是不安全的,因为系统上的其他用户可以看到密码

您可以使用
expect
解决安全问题
expect
是一个可以以更安全的方式将密码传递给mysql的程序。请确保远程系统上安装了
expect
。下面是一个使用数据库
test
上的
SHOW TABLES
命令的示例:

include('Net/SSH2.php');

$ssh = new Net_SSH2('192.xxx.xxx.xxx');
if (!$ssh->login('ssh_user', 'ssh_password')) {
exit('Login Failed');
}

echo $ssh->exec('expect <<EOF
# disable command output
log_user 0
# start the mysqldump process
spawn mysql -uTHE_USER -p test -e "SHOW TABLES"
# wait for the password prompt
expect "password:"
# send the password (mind the \r)
send "THE_PASSWORD\r"
# enable output again
log_user 1
# echo all outout until the end
expect eof
EOF
');
include('Net/SSH2.php');
$ssh=newnetssh2('192.xxx.xxx.xxx');
if(!$ssh->login('ssh\u user','ssh\u password')){
退出(“登录失败”);
}
echo$ssh->exec('expectshort and simple

echo $ssh->exec('echo "select * from table where company_id=\"15\";" | mysql -u username -password=password database');
简明扼要

echo $ssh->exec('echo "select * from table where company_id=\"15\";" | mysql -u username -password=password database');

可能重复的不是重复的我想也是,但hek2mgl的答案更好。可能重复的不是重复的,我想也是,但hek2mgl的答案更好。我想连接到mysql并开始一些插入、更新CUID的过程。这是什么?这是一个如何发出命令的示例..我我在数据库测试中使用
SHOW TABLES
命令。您不需要将expect与phpseclib一起使用。只需执行$ssh->write(“…”),然后执行$read->(“…”)其中传递给read的参数是您所期望的。它可以采用字符串文本或正则表达式的形式。正则表达式的示例:what is
CMDS
?what is
pcs
?@hek2mgl-问题是您没有在命令结束之前添加“\n”。例如,
$ssh->write(“mysql-uroot-p test-e'SHOW TABLES”);
应该是
$ssh->write(“mysql-uroot-p test-e'SHOW TABLES'\n”)
。我的意思是,当你在终端中键入命令时,你通常会按enter键,不是吗?你不只是键入命令,而不是按enter键,期望Linux神奇地运行它,是吗?我想连接到mysql并开始一些插入、更新CUID的过程。这是什么?这是一个如何发出命令的示例。我正在使用
SHOW t在数据库测试中使用ABLES
命令。您不需要将expect与phpseclib一起使用。只需执行$ssh->write(“…”),然后执行$read->(“…”)其中传递给read的参数是您所期望的。它可以采用字符串文本或正则表达式的形式。正则表达式的示例:what is
CMDS
?what is
pcs
?@hek2mgl-问题是您没有在命令结束之前添加“\n”。例如,
$ssh->write(“mysql-uroot-p test-e'SHOW TABLES”)
应该是
$ssh->write(“mysql-uroot-p test-e'SHOW TABLES'\n”);
。我的意思是,当你在终端中键入命令时,你通常会按enter键,不是吗?你不只是键入命令,而不是按enter键,期望Linux神奇地运行它,是吗?