我有一个中央系统(Web应用程序),该系统应该一个接一个地连接到一组节点(客户端),以便从通过mysql View 公开的数据库中获取记录集。
我正在寻找针对这种情况的最佳实施方案。目前,我已经想到了这种流程。
1.第一种方法
伪代码
$dataFetched=array();
$clients= getListOfClients();
//
foreach($clients as $client){
// client={details:{id,name,etc....},
// ssh:{pem:'client.pem',localMysqlPort:3307 ,remoteMyqlPort:3306,
// sshUser:'demo@clientHost.com'},
// mysql:{user:'tunnelUser',password:'password'}
// }
//connect ssh connection
$ssh_connection=new Ssh_connect($client->ssh)
if($ssh_connection->status){
$dataFetched[$client->id]=array("status"=>'OK','data'=>fetchMysqlData($client->mysql))
}else{
$dataFetched[$client->id]=array("status"=>'NO_OK','data'=>array())
}
$ssh_connection->destroyTunnel();
unset($ssh_connection);
}
这种方法的一些顾虑/问题
2.第二种方法
通过cron-job呈现数据。
几点:
据我所知,在反向隧道的情况下,echo客户端知道需要与之连接的服务器。因此,我们需要在每个客户端节点上设置一个特权较低的用户以访问服务器,这似乎更加安全,因为我不必将所有pem文件都放在Central服务器的一个位置。如果我弄错了,请纠正我。
非常感谢您的建议
最佳答案
有一个用于PHP的SSH库。它称为ssh2,可在PECL上使用。
它依赖于libssh2,但是在基于Linux的计算机上启动并运行它并不难。
存储pem文件的最佳方法是在您的Web目录外部,并具有有限的权限-刚好足以使您的Web应用程序能够读取这些文件。或者,您可以将ssh-agent守护程序设置为作为Web应用程序运行。
(我在这里希望您的PHP应用程序不会全部在同一用户下运行。对于Apache,有一个鲜为人知的mod_ruid2模块,该模块可让您更改用户并更改PHP Web应用程序的目录,而无需设置fastcgi或suExec)。
可悲的是,ssh2_tunnel只创建一个新的PHP资源,不能用来创建新的mysql连接(嗯,至少不使用mysqli_connect&friends)。
您可以做的是在本地服务器上执行SQL命令,将数据库密码存储在〜/ .my.cnf中
〜/ .my.cnf :
[client]
password = lolcats1234
然后,使用PHP和ssh2,一旦连接就可以运行以下代码:
stream_set_blocking($stream, true);
$stream = ssh2_exec($connection, 'mysql -u db -p db -e "select * from table"');
$first = true;
while($line = fgets($stream)) {
if ($first) {
$first = false;
continue;
}
// process one line of results...
echo $line."<br />";
}
另外,如果您仅使用反向隧道,则可以使用本地脚本进行mysql_connect,而无需担心完全执行任何SSH工作。
关于php - 从php到多个节点的SSH隧道,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22086849/