我一直在使用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脚本挂起,任何想法?
答案 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没有任何要求。