在PHP中创建永久SSH隧道

在PHP中创建永久SSH隧道,php,ssh-tunnel,Php,Ssh Tunnel,我有一个函数,需要通过PHP中的SSH隧道将PDO对象返回到远程主机 我目前的工作方式是,当请求PDO对象时,它创建SSH隧道,连接PDO并返回PDO对象 我希望能够创建一次SSH隧道并将其保留在那里,这样,当我有100个针对特定远程服务器的PDO对象的请求时,我只创建一次SSH隧道 目前,当脚本完成运行时,SSH隧道将被破坏 我如何设置它来实现这一点 目前我已尝试: exec('ssh -fNg -L 13306:127.0.0.1:3306 user@host > /dev/null

我有一个函数,需要通过PHP中的SSH隧道将PDO对象返回到远程主机

我目前的工作方式是,当请求PDO对象时,它创建SSH隧道,连接PDO并返回PDO对象

我希望能够创建一次SSH隧道并将其保留在那里,这样,当我有100个针对特定远程服务器的PDO对象的请求时,我只创建一次SSH隧道

目前,当脚本完成运行时,SSH隧道将被破坏

我如何设置它来实现这一点

目前我已尝试:

exec('ssh -fNg -L 13306:127.0.0.1:3306 user@host > /dev/null 2>/dev/null &');

在这两种情况下,脚本退出时隧道都会被破坏


谢谢

这是一个奇怪的用例,我并不特别推荐通过分叉web请求来实现。[或者说,实际上]不过,您可能能够利用ssh的
ControlMaster
自行处理持久化和多路复用连接

添加以下选项:

  • -o ControlMaster auto
    • 允许通过单个网络连接共享多个会话
  • -o ControlPersist 30
    • 指定在关闭初始客户端连接后,主连接应在后台保持打开状态
  • -o ControlPath/path/to/socket/dir/%r@%h-%p
    [可选,但推荐]
    • 指定用于连接共享的控制套接字的路径
  • 参考:

    需要注意的是,一旦建立了ControlMaster套接字,任何被允许访问它的用户都可以在没有身份验证的情况下访问它。您可能希望根据应用程序身份验证/授权将套接字路径彼此隔离

    通过以上步骤,ssh二进制文件本身可以处理保持连接、等待超时过期并正常关闭连接所需的基本数据化。尽管需要注意的是,如果ssh进程被终止,套接字仍然存在,需要在再次连接之前手动清理


    此外,此代码依赖于对用户的高度信任,用户不会做任何愚蠢和/或恶意的事情。至少要确保您在任何和所有可能进入已执行命令的用户输入上自由地使用和。

    这是一个奇怪的用例,而不是我特别建议通过分叉web请求来完成的事情。[或者说,实际上]不过,您可能能够利用ssh的
    ControlMaster
    自行处理持久化和多路复用连接

    添加以下选项:

  • -o ControlMaster auto
    • 允许通过单个网络连接共享多个会话
  • -o ControlPersist 30
    • 指定在关闭初始客户端连接后,主连接应在后台保持打开状态
  • -o ControlPath/path/to/socket/dir/%r@%h-%p
    [可选,但推荐]
    • 指定用于连接共享的控制套接字的路径
  • 参考:

    需要注意的是,一旦建立了ControlMaster套接字,任何被允许访问它的用户都可以在没有身份验证的情况下访问它。您可能希望根据应用程序身份验证/授权将套接字路径彼此隔离

    通过以上步骤,ssh二进制文件本身可以处理保持连接、等待超时过期并正常关闭连接所需的基本数据化。尽管需要注意的是,如果ssh进程被终止,套接字仍然存在,需要在再次连接之前手动清理


    此外,此代码依赖于对用户的高度信任,用户不会做任何愚蠢和/或恶意的事情。至少要确保您在任何和所有可能进入已执行命令的用户输入上自由地使用和。

    您真的是在通过隧道传输到localhost吗?你为什么要这么做?所以你希望在脚本退出后隧道保持开放。为什么要在脚本中打开隧道,而不是在可以单独管理的东西中?例如:独立于web运行的shell脚本server@Joni-简化版本是,用户可以单击“连接到远程服务器”,并在网页中输入服务器名称。一旦连接,将来会有许多对同一服务器的请求。在连接之前,系统不知道它将要连接,因此我希望隧道由用户启动,但此后保持连接。我正在脚本中打开隧道,因为我不知道如何实现这一点。@Sammitch-我不是隧道到本地主机,而是隧道到本地主机user@hostAre你真的要挖地道到本地主机吗?你为什么要这么做?所以你希望在脚本退出后隧道保持开放。为什么要在脚本中打开隧道,而不是在可以单独管理的东西中?例如:独立于web运行的shell脚本server@Joni-简化版本是,用户可以单击“连接到远程服务器”,并在网页中输入服务器名称。一旦连接,将来会有许多对同一服务器的请求。在连接之前,系统不知道它将要连接,因此我希望隧道由用户启动,但此后保持连接。我正在脚本中打开隧道,因为我不知道如何实现这一点。@Sammitch-我不是隧道到本地主机,而是隧道到本地主机user@hostInteresting,谢谢。我想确保我完全理解这里的安全含义。ssh隧道具有-N选项,因此用户无法运行comman
    exec('autossh -f -M 13308 -fNg -L 13306:127.0.0.1:3306 user@host > /dev/null 2>/dev/null &');