Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/234.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
如何在PHP中安全地维护持久SSH连接?_Php_Security_Ssh - Fatal编程技术网

如何在PHP中安全地维护持久SSH连接?

如何在PHP中安全地维护持久SSH连接?,php,security,ssh,Php,Security,Ssh,我目前正在使用主从模式的VPS面板上工作。一个主服务器运行一个用PHP编写的面板,并通过SSH管理多个从服务器。从属服务器通过有限的帐户访问,该帐户可以执行特定的服务器管理相关命令,并且所有交互都记录在帐户本身无权访问的目录中 我目前正在使用PHP-SSH2,但这种方法存在一些问题: 退出代码不能可靠地返回,因此所有命令都必须在包装器脚本中执行,该脚本将stdout、stderr和退出代码打包成JSON对象,并通过stdout返回。此脚本必须存在于每个从属服务器上 PHP-SSH2库不知道“自

我目前正在使用主从模式的VPS面板上工作。一个主服务器运行一个用PHP编写的面板,并通过SSH管理多个从服务器。从属服务器通过有限的帐户访问,该帐户可以执行特定的服务器管理相关命令,并且所有交互都记录在帐户本身无权访问的目录中

我目前正在使用PHP-SSH2,但这种方法存在一些问题:

  • 退出代码不能可靠地返回,因此所有命令都必须在包装器脚本中执行,该脚本将stdout、stderr和退出代码打包成JSON对象,并通过stdout返回。此脚本必须存在于每个从属服务器上
  • PHP-SSH2库不知道“自定义连接超时”的概念,这意味着在尝试使用PHP-SSH2连接之前,我必须使用fsockopen探测服务器-如果我不这样做,无法访问的服务器可能会延迟页面加载一分钟或更长时间。由于下一个问题,情况更糟
  • 永久连接是不可能的。这导致面板中的页面加载时间非常荒谬,尤其是与上一个超时问题相结合
现在,我主要是想解决最后一个问题

我遇到过几种可能的解决方案,但它们都有某种问题:

  • 使用PHPSecLib,一个纯PHP SSH实现,并将所有fsockopen调用替换为pfsockopen调用。这将使连接持久化,但这比我所希望的更黑客,PHP中持久套接字的安全含义尚不清楚
  • 设置从主服务器到每个从服务器的持久SSH隧道,并在每个从服务器上运行一个简单的守护程序(绑定到localhost),该从服务器运行任何命令。这是一个有两个原因的问题。首先,它介绍了在从属服务器上需要一个守护进程,这是我宁愿避免的。第二个问题是,如果有人要破坏从属服务器上的有限帐户,他们仍然可以通过连接到“命令守护程序”来运行某些系统命令,即使他们无法从自己的shell访问这些命令。这是一个问题
  • 在主服务器上运行守护程序,代表面板管理到从属服务器的持久SSH连接。这涉及到用Python编写SSH客户机(这是我所熟悉的唯一合适的语言),并可能归结为使用paramiko。由于paramiko的文档很差,这不是一个很有吸引力的选择,甚至可能会导致安全问题,因为我不完全清楚paramiko应该如何使用这些东西
以下选项不适用:

  • 为面板本身切换到其他语言。我正在用PHP编写这个面板,因为这是我最熟悉的语言,而且我知道我可能会遇到的怪癖和潜在问题。用我不熟悉的语言写一个重要的面向公众的项目是个坏主意
  • 使用Twisted作为第三个“可能的解决方案”。Twisted是一个非常大且复杂的依赖项,文档似乎比paramiko更糟糕
  • 在从属服务器上运行HTTPd或其他非SSH面向公共的守护程序
实际上,当需要联系多个服务器进行页面加载时,页面加载时间有时超过一分钟。这显然不适用于VPS面板


我的目标是提供某种实现,以避免使用PHP-SSH2时引入的连接开销。以安全的方式实现这一点的最佳方法是什么,同时在从属服务器上引入最少的依赖关系?

您可以使用AutoSh,并使用AutoSh创建反向(portforward)通道。然后让php应用程序与这些反向ssh端口对话。如果ssh连接失败,AutoSh将继续尝试重新创建连接。您的php应用程序将无法连接到反向隧道,甚至不会超时。

选项3如何,但也要用php编写守护程序?这就是我正在尝试的类似项目的路线


您可以使用FIFO文件而不是套接字来与它通信。

我已经在AutoSH上混了一段时间,但我不确定如何以适合我的用例的方式实现它。你能用一个例子详细说明AutoSh在这种情况下是如何有用的吗?你有没有想出一个好的解决方案?