我目前正在用 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。
对此的任何帮助将不胜感激 - 在此先感谢!