在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。
任何有关这方面的帮助将不胜感激 - 提前感谢!
没有找到相关结果
已邀请:
3 个回复
邦绊门蔽惩
如果是这样,那么你可以使用phpseclib的纯PHP SSH实现来做到这一点。例如。
如果不是那么(1)我会说你最好使用phpseclib而不是你当前的实现和(2)如果你想要phpseclib作者称之为“交互式”支持,也许你可以试试联系作者?也许愿意向他支付一些钱来激励他开发这个功能。看一下支持论坛,作者似乎反应灵敏。
缉康怪
淘圃跺枯替
如果需要更高级的东西,还可以使用ssh2_shell()创建ssh交互式shell。