1

我目前正在用 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。

对此的任何帮助将不胜感激 - 在此先感谢!

4

3 回答 3

2

您是否认为以下是对终端进行写访问的示例?:

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 作者所说的“交互式”支持,也许你可以试试联系作者?也许愿意付给他一些钱来激励他开发这个功能。查看支持论坛,作者似乎反应足够。

于 2011-01-19T03:26:33.343 回答
1

我不确定 php 是否是正确的工具。为什么不使用更接近 shell 环境的东西,比如 bash 脚本?

我可以想象您想要使用 PHP 的唯一原因是,您可以通过单击某处页面上的链接来启动该过程,从而在您的系统应该具有的任何安全性上打一个大洞。但如果你真的必须,那么用更友好的 shell 语言编写脚本并简单地使用 php 作为调用脚本的网关仍然更容易。

于 2011-01-19T00:02:55.683 回答
0

您可以使用 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。

于 2011-01-18T23:34:36.040 回答