1

我一直在玩 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 脚本挂起,有什么想法吗?

4

2 回答 2

2

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

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

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

于 2012-04-23T03:42:16.787 回答
2

就个人而言,我会使用phpseclib,一个纯 PHP SSH 实现。例子:

<?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 的最大优势是可移植性。如果我工作,我们使用亚马逊网络服务,有时我们会转移到新的产品服务器或开发服务器,设置它们最困难的部分是安装所有的 PECL 扩展,什么不是。

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

于 2012-04-26T05:52:29.683 回答