【问题标题】:php ssh2_exec not executing 'su' commandphp ssh2_exec 未执行“su”命令
【发布时间】:2011-08-09 15:10:57
【问题描述】:

我在 ssh2 for php 上玩得很开心。(!)

我正在通过 ssh-ing 到 localhost(运行 ubuntu)进行测试。我已经设法使用我的用户名(不是 root)连接和验证,并且一些命令(如 'ls' 返回一些信息,这是有希望的。肯定会到达某个地方。

接下来我想要做的是发出一个“su”命令,然后给出 root 密码。

我没有收到错误,并且返回了资源,但流中似乎没有数据。 (我有点期待“密码:”提示)。我无法直接使用 root 密码进​​行身份验证,因为 ssh 禁用了该密码。

你认为“su”有什么理由会返回一些文本吗?

我应该期待“密码:”提示返回吗?

这是我的代码:

function changeServerPassword( $ip, $port, $sshUser, $sshPassword, $rootPassword, $newRootPassword, $newSSHPassword = false) {
        // login to server using $sshUser and $sshPassword
        // su as root and enter $rootPassword
        // if any of the above steps fail, return with appropriate error message
        if (!function_exists("ssh2_connect")) die("function ssh2_connect doesn't exist");
        // log in 
        // Do I have to make sure that port is a number?
        if(!($con = ssh2_connect($ip, $port))){
            echo "fail: unable to establish connection\n";
        } else {
            // try to authenticate with username root, password secretpassword
            if(!ssh2_auth_password($con, $sshUser, $sshPassword)) {
                echo "fail: unable to authenticate\n";
            } else {
                // alright, we're in!
                echo "okay: logged in...<br />";

                // 
                if (!($stream = ssh2_exec($con, "su"))) {
                    echo "fail: unable to execute command\n";
                } else {
                    echo $stream."<br />";
                    // collect returning data from command
                    stream_set_blocking($stream, true);
                    echo "after stream_set_blocking<br />";
                    $data = "";
                    while ($buf = fread($stream,4096)) {
                        $data .= $buf;
                    }
                    echo "data len: " . strlen($data) . "<br />";
                    echo $data."<br />";
                    fclose($stream);
                }
            }
        }
    }

借自http://kevin.vanzonneveld.net/techblog/article/make_ssh_connections_with_php/ 尊重。

我得到的输出是:

okay: logged in...
Resource id #3
after stream_set_blocking
data len: 0

提前感谢您的帮助:)

【问题讨论】:

  • 提出更好的问题会得到更好的回答。
  • 请提供更多信息的问题名称?
  • passwd 使用 stderr 作为提示。不知道它是否相关,但您提到的其他工作命令都使用 stdout 作为输出。
  • 现已编辑。以标题道歉。有点兴奋。

标签: php ssh


【解决方案1】:

您应该尝试使用最新的 SVN 版本的 phpseclib - a pure PHP SSH implementation - 代替。以下是你如何使用 su:

<?php
include('Net/SSH2.php');

$ssh = new Net_SSH2('localhost', 22);
$ssh->login('username', 'password');

$ssh->read('[prompt]');
$ssh->write("su - user\n");
$ssh->read('Password:');
$ssh->write("Password\n");
echo $ssh->read('[prompt]');
?>

【讨论】:

  • 非常感谢您的回答。事实上,我一直在检查 phpseclib 库,它看起来不错,但正如我在 *.com/questions/5735432/… 上发布的那样,我真的需要能够设置标志。
  • 我在 SSH2.php 文件中的任何地方也找不到写入和读取功能。这些函数的文档在哪里,我在 phpseclib 文档中看不到它们?我很抱歉再问一个愚蠢的问题,但是[提示]是什么意思?读取函数在这里做什么?
  • 对不起,我的意思是在上述所有内容之前说,当我尝试将 su 与 phplibsec 一起使用时,我收到错误 'su: must be run from a terminal' 错误作为我链接到的帖子以上细节。长篇大论,我警告你。
  • 写入和读取功能在最新的 SVN 版本的 phpseclib 中:phpseclib.svn.sourceforge.net/viewvc/phpseclib/trunk/phpseclib/… 你会以同样的方式显示它们正在使用中。
  • 感谢蒂芙尼的评论。我不知道有一个新版本。我使用它的尝试总是以程序挂起而告终。我已将问题归结为 read() 方法,尽管我对此无法更确定,因为当它挂起时,它似乎立即挂起我什至不确定我是否能够做我想做的事需要做的是发出以下命令“ssh -t -t -l username host su -”,因为该程序已经 ssh 进入了。不幸的是,我认为我在这里的技能水平已经超出了我的水平,我可能不会能够让它工作。
【解决方案2】:

也许试试bash -c susu rootbash -c "su root" 之类的?

【讨论】:

    【解决方案3】:

    您所要做的就是在执行“su”命令时附加您的超级用户密码。您可以对您的代码进行以下修改。

    $cmd = "su";
    $cmd = "echo '" . $sshPassword . "' | sudo -S " . $cmd;
    if (!($stream = ssh2_exec($con, $cmd))) { 
    ... 
    }
    

    【讨论】: