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

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

  • 以编程方式输入 SSH 密码。我知道当您想要无密码 SSH 登录时,使用 SSH key 是一种方法,但请记住,这是一个部署框架。它可能一次部署到 25 台服务器。要求用户设置 SSH key 来使用框架似乎不正确,谁想输入 25 次密码?我在这里使用 Capistrano 作为模型 - 它会询问您的密码一次,然后使用它来建立 SSH 连接,而无需重新提示用户。我不建议将密码存储在部署脚本中,只需(默默地)输入一次并使用,直到部署任务完成。
  • 将输出发送到 PHP 脚本。我希望能够独立拦截每个 SSH session 的终端输出,对其进行修改,然后将其发送回终端供用户查看。这样,我可以将服务器的名称添加到每一行输出中以显示正在发生的事情。
  • 提供对终端的写(和读)访问。重要的是用户(或脚本)能够在终端中输入除 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's pure PHP SSH implementation .例如。
    $ssh = new Net_SSH2(...);
    $ssh->login(..., ...);
    $ssh->exec('command1; command2;');
    

    如果不是,那么(1)我会说你最好使用 phpseclib,而不是你当前的实现,(2)如果你想要 phpseclib 作者所说的“交互式”支持,也许你可以试试联系作者?也许愿意付给他一些钱来激励他开发这个功能。查看支持论坛,作者似乎 react 足够。

    https://stackoverflow.com/questions/4730206/

    相关文章:

    ssh - ssh是否可以回显您发送的命令?

    bash - SSH隧道复杂问题

    pdf - 生成的pdf中的文本是反向的

    mongodb - Grails 3 MongoDB无法从application.yml中读取con

    spring-mvc - 用于 'dashboard'风格UI(涉及多个域)的 Controller

    svn - 通过SSH的svn diff-结果与Trac不同吗?

    ssh - 如何测量 SSH 隧道的带宽?

    session - 如何存储操作的参数以供以后再次使用

    grails - Grails从1.3.7升级到3.2.6的路径

    ssh - Amazon EC2 ssh 登录失败