使用php的ssh2进行身份验证

时间:2013-06-24 18:43:25

标签: php apache ubuntu ssh osx-mountain-lion

我正在尝试使用PHP的SSH2在脚本运行时在我的两台服务器之间建立SSH连接,并使用来自http://kvz.io/blog/2007/07/24/make-ssh-connections-with-php/的信息到达某处。也就是说,使用以下代码,我一直无法进行身份验证。似乎两个服务器正在通信,但根本没有进行身份验证,因为我收到“失败:无法验证”消息。我可以使用相同的信息直接使用Web服务器的终端轻松连接。由于显而易见的原因,值是通用的。如果它意味着什么,SSH服务器是运行Mountain Lion的Mac(它运行OS X VM),Web服务器运行Ubuntu 12.04。

<?php
if (!function_exists("ssh2_connect")) die("function ssh2_connect doesn't exist");
if(!($con = ssh2_connect('192.168.0.1', 22))){
    echo "fail: unable to establish connection\n";
} else {
    if(!ssh2_auth_password($con, 'myusername', 'mysecretpassword')) {
        echo "fail: unable to authenticate\n";
    } else {
        echo "okay: logged in...\n";

        // execute a command
        if (!($stream = ssh2_exec($con, "mysshcommand" ))) {
            echo "fail: unable to execute command\n";
        } else {

            stream_set_blocking($stream, true);
            $data = "";
            while ($buf = fread($stream,4096)) {
                $data .= $buf;
            }
            fclose($stream);
        }
    }
}
?>

1 个答案:

答案 0 :(得分:0)

我不能肯定地说,但是您连接的服务器可能使用的是键盘交互式身份验证而不是密码身份验证。使用像PuTTY这样的客户端,实际上他们看起来并不相同。

我的建议是使用phpseclib, a pure PHP SSH2 implementation。例如

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

$ssh = new Net_SSH2('www.domain.tld');
if (!$ssh->login('username', 'password')) {
    exit('Login Failed');
}

echo $ssh->exec('pwd');
echo $ssh->exec('ls -la');
?>

首先尝试密码验证,如果失败,它将尝试键盘交互。如果即使失败了,你也可以通过phpseclib获取日志,看看它在做什么。如果有必要,我会引导你完成。