在PHP中通过SSH与多个服务器交互

我目前正在用PHP编写部署框架。该框架连接到服务器并通过SSH执行命令。我一直在寻找相当长的一段时间,试图在PHP中找到一种更好的方法。这是要求。该技术应该能够: 以编程方式输入SSH密码。我知道当你想要无密码的SSH登录时,使用SSH密钥是可行的,但请记住,这是一个部署框架。它可能一次部署到25台服务器。要求用户设置SSH密钥以使用框架,谁想要输入密码25次似乎是不对的?我在这里使用Capistrano作为模型 - 它会询问您的密码一次,然后使用它来建立SSH连接而无需重新提示用户。我并不是建议将密码存储在部署脚本中,只是(静默地)输入一次并使用直到部署任务完成。 将输出发送到PHP脚本。我希望能够独立拦截每个SSH会话的终端输出,修改它,然后将其发送回终端供用户查看。这样,我可以将服务器的名称添加到每行输出上,以显示正在发生的事情。 提供对终端的写入(以及读取)访问。除了SSH密码之外,用户(或脚本)能够将其他信息输入终端是很重要的。 支持SSH v2。 目前,我的框架将部署脚本中的命令“编译”成一个巨大的字符串,并使用SSH命令执行它们。每个最终部署命令看起来像这样:
ssh -t -t -p 12345 user@server.com 'command1; command2;'
这些SSH命令中的每一个都是通过PHP的内置
passthru
函数执行的:
<?php passthru("ssh -t -t -p 12345 user@server.com 'command1; command2;'"); ?>
我尝试过使用proc_open和几乎所有PHP的其他命令执行函数都无济于事 - 它们都没有提供我上面列出的所有功能。另外,我尝试了几种纯PHP的SSH实现,也无济于事。这些库要么不提供对终端的写访问权限,要么不支持SSH v2。 任何有关这方面的帮助将不胜感激 - 提前感谢!     
已邀请:
您是否认为以下是对终端进行写访问的示例?:
ssh -t -t -p 12345 user@server.com 'command1; command2;'
如果是这样,那么你可以使用phpseclib的纯PHP SSH实现来做到这一点。例如。
$ssh = new Net_SSH2(...);
$ssh->login(..., ...);
$ssh->exec('command1; command2;');
如果不是那么(1)我会说你最好使用phpseclib而不是你当前的实现和(2)如果你想要phpseclib作者称之为“交互式”支持,也许你可以试试联系作者?也许愿意向他支付一些钱来激励他开发这个功能。看一下支持论坛,作者似乎反应灵敏。     
我不确定php是否是正确的工具。为什么不使用更接近shell环境的东西,比如bash脚本? 我可以想象你想要使用PHP的唯一原因是你可以通过点击某个页面上的链接来启动这个过程,从而在系统所谓的安全性方面打出一个大洞。但是,如果你真的必须,那么用更易于使用shell语言编写脚本并简单地使用php作为调用脚本的网关仍然更容易。     
您可以使用PHP中的PECL扩展进行SSH连接。 http://php.net/manual/en/book.ssh2.php
$connection = ssh2_connect('server.com', 22);
ssh2_auth_password($connection, 'username', 'password');
$stream1 = ssh2_exec($connection, $command1);
$stream2 = ssh2_exec($connection, $command2);
如果需要更高级的东西,还可以使用ssh2_shell()创建ssh交互式shell。     

要回复问题请先登录注册