首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在PHP中通过SSH与多个服务器交互

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

Stack Overflow用户
提问于 2011-01-18 23:22:13
回答 3查看 2.5K关注 0票数 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 v2。

在这方面的任何帮助都将不胜感激-谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-01-19 03:26:33

您认为以下是对终端的写入访问的示例吗?:

代码语言:javascript
复制
ssh -t -t -p 12345 user@server.com 'command1; command2;'

如果是这样的话,那么您可以使用phpseclib的纯PHP SSH实现来完成这个任务。例如:

代码语言:javascript
复制
$ssh = new Net_SSH2(...);
$ssh->login(..., ...);
$ssh->exec('command1; command2;');

如果不是那样的话,(1)我会说,使用phpseclib比使用当前的实现要好;(2)如果您想要phpseclib作者所提到的“交互式”支持,那么您可以尝试联系作者吗?也许可以给他一些钱来激励他开发这个功能。从支持论坛上看,作者似乎有足够的反应能力。

票数 2
EN

Stack Overflow用户

发布于 2011-01-19 00:02:55

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

我能想象您想要使用PHP的唯一原因是,您可以通过单击某个页面上的链接来启动该过程,从而在您的系统应该具有的任何安全性上都会出现一个很大的漏洞。但是,如果确实必须这样做,那么用更友好的shell语言编写脚本还是更容易的,只需使用php作为网关来调用脚本。

票数 1
EN

Stack Overflow用户

发布于 2011-01-18 23:34:36

您可以使用PHP中的PECL扩展进行SSH连接。http://php.net/manual/en/book.ssh2.php

代码语言:javascript
复制
$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。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4730206

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档