【问题标题】:Connecting to a MySQL database through SSH PHP通过 SSH PHP 连接到 MySQL 数据库
【发布时间】:2020-03-29 03:01:52
【问题描述】:

对于我的大学项目,我连接到 MySQL 数据库。从 covid 19 开始,我无法上大学,所以必须远程进行,谁能帮助 PHP 连接?

SSH 主机名:ssh.University.uk:2223 SSH 用户名:s4905304 SHH 密码:.... SSH 密钥文件:空白

MySQL 主机名:127.0.0.1 MySQL 服务器端口:3306 用户名:s4905304 密码:.....

【问题讨论】:

  • 我认为贵校最适合提供帮助。

标签: php mysql ssh


【解决方案1】:

试试这个:

第 1 步。

为您的MySQL 数据库服务器设置SSH tunnel(为了安全起见,最好通过Jumpbox)。

ssh -fNg -L 3307:10.3.1.55:3306 username@ssh_jumpbox.com 

这里的关键是 -L,它表示我们正在进行本地端口转发。

本地端口转发语法

<local_workstation_port>:<database_server_addr_remote_end_of_tunnel>:<database_server_port_remote_end>
username@ssh_proxy_host.com 

其他开关有:

  • -f(转到后台)
  • -N(不执行远程命令)
  • -g(允许远程主机连接到本地转发端口)

私钥认证,上面加(-i)开关:

-i /path/to/private-key

第 2 步。

告诉您的本地 MySQL 客户端通过您的计算机 (-h 127.0.0.1) 上的本地端口 3307 通过您的 SSH tunnel 连接,该端口现在转发通过您在步骤 1 中建立的 SSH tunnel 发送给它的所有流量.

mysql -h 127.0.0.1 -P 3307 -u dbuser -p passphrase

客户端和服务器之间的数据交换现在通过加密的 SSH 连接发送并且是安全的。

不建议直接通过隧道连接到您的数据库服务器 - 让数据库服务器直接从 Internet 访问是一项巨大的安全责任。将隧道目标地址设置为 Jumpbox/Bastion 主机的 Internet 地址(参见步骤 1 中的示例),并将数据库的目标设置为远程网络上数据库服务器的 internal IP 地址。 SSH 将完成剩下的工作。

感谢 Chris Snyder 的精彩文章 http://chxo.com/be2/20040511_5667.html

第 3 步。

正在连接。 DSN

PDO 有一种奇特的连接方法,称为 DSN。没什么 虽然很复杂 - 而不是一个简单明了的选项列表, PDO 要求你输入三个不同的配置指令 不同的地方:

  • database driverhostdb (schema) namecharset,以及使用频率较低的portunix_socket进入DSN;
  • usernamepassword 转到构造函数;
  • 所有其他选项都进入选项数组。

其中DSN 是分号分隔的字符串,由param=value 组成 对,以驱动程序名称和冒号开头:

       mysql:host=localhost;dbname=test;port=3306;charset=utf8mb4
driver^    ^ colon         ^param=value pair    ^semicolon  

请注意,遵循正确的格式很重要 - 没有空格或 DSN 中必须使用引号或其他装饰,但仅限 参数、值和分隔符,如manual所示。

下面是MySQL 的示例:

 $host = '127.0.0.1';
$db   = 'test';
$user = 'root';
$pass = '';
$charset = 'utf8mb4';

$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$options = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
];
try {
     $pdo = new PDO($dsn, $user, $pass, $options);
} catch (\PDOException $e) {
     throw new \PDOException($e->getMessage(), (int)$e->getCode());
}

引用自:https://phpdelusions.net/pdo#dsn

【讨论】:

  • 查看我的编辑。我已将引用的内容放在引用块中。这样人们就知道哪些词是你的,哪些是引用的。以后如果您复制和粘贴非您编写的文本,请使用引用块。
  • 哦,这就是你的意思,没有使用块引号。哈,是的,我同意它有帮助,但对于任何有兴趣实际阅读而不仅仅是略读的人来说,之前都很清楚。不过,使用块引用的好习惯,我会记住这一点。 PS:你是个坚持不懈的人,有人告诉你吗?有时这可能是一件坏事^_^。感谢您的编辑和帮助。
猜你喜欢
  • 2013-08-06
  • 1970-01-01
  • 2016-10-25
  • 2014-09-17
  • 2019-02-06
  • 1970-01-01
  • 2012-12-29
  • 2010-12-30
  • 2011-02-17
相关资源
最近更新 更多