SSH2更改用户密码

时间:2012-04-23 03:34:17

标签: php shell ssh centos

我一直在使用SSH,现在我需要通过PHP的ssh2更改用户密码,

这是我的代码:

$stream = ssh2_exec($ssh, 'passwd test1234');
stream_set_blocking($stream, true);
$data = '';
while($buffer = fread($stream, 4096)) {
    $data .= $buffer;
}
fclose($stream);
echo $data."<hr/>";

$stream = ssh2_exec($ssh, 'saulius123');
stream_set_blocking($stream, true);
$data = '';
while($buffer = fread($stream, 4096)) {
    $data .= $buffer;
}
echo $data."<hr/>";
$stream = ssh2_exec($ssh, 'saulius123');
    stream_set_blocking($stream, true);
    $data = '';
    while($buffer = fread($stream, 4096)) {
        $data .= $buffer;
    }
    echo $data."<hr/>";

然而,这只是让我的PHP脚本挂起,任何想法?

2 个答案:

答案 0 :(得分:2)

ssh2_exec调用命令;要发送输入,您需要写入流。

也就是说,$stream使您可以访问标准输入和标准输出。因此,在尝试回读输出之前,您需要在fwrite上使用$stream编写要设置的密码。

由于您已将流置于阻止模式,因此在您的脚本等待passwd的同时,passwd正在等待您的输入(密码)。结果,脚本挂起。

答案 1 :(得分:2)

就个人而言,我会使用phpseclib, a pure PHP SSH implementation。例如:

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

$key = new Crypt_RSA();
//$key->setPassword('whatever');
$key->loadKey(file_get_contents('privatekey'));

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

echo $ssh->read('username@username:~$');
$ssh->write("ls -la\n");
echo $ssh->read('username@username:~$');
?>

它比libssh2的最大优点是可移植性。我工作时使用亚马逊网络服务,有时我们会转移到新的prod服务器或开发服务器,设置它们最困难的部分是安装所有PECL扩展,什么不是。

相比之下,phpseclib没有任何要求。