我目前正在用 PHP 编写一个部署框架。该框架通过 SSH 连接到服务器并执行命令。我花了很长时间试图在 PHP 中找到一种更好的方法。这是要求。该技术应该能够:

  1. 以编程方式输入 SSH 密码。我知道当您需要无密码 SSH 登录时,使用 SSH 密钥是可行的方法,但请记住,这是一个部署框架。它可能会同时部署到 25 台服务器。要求用户设置 SSH 密钥才能使用该框架似乎不太正确,谁愿意输入密码 25 次呢?我在这里使用 Capistrano 作为模型 - 它会询问您一次密码,然后使用它来建立 SSH 连接,而无需重新提示用户。我并不是建议将密码存储在部署脚本中,只需(静默)输入一次并使用,直到部署任务完成。

  2. 将输出发送到 PHP 脚本。我希望能够独立拦截每个 SSH 会话的终端输出,对其进行修改,然后将其发送回终端供用户查看。这样,我可以将服务器的名称添加到每行输出中以显示正在发生的情况。

  3. 提供对终端的写(以及读)访问。除了 SSH 密码之外,用户(或脚本)能够在终端中输入其他信息非常重要。

  4. 支持 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的唯一原因是,您可以通过单击某个地方的页面上的链接来启动该过程,从而在系统所谓的任何安全性方面打一个大孔。但是,如果您确实必须,那么以更友好的语言编写脚本并将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 Interactive Shell。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top