我试图解析" passwd"使用phpseclib命令我的机器,但它不能通过第一次密码输入。请看下面的代码。
$ssh->write("
passwd $new_user\n
$new_user_pw\n
$new_user_pw\n
");
$ssh->setTimeout(5);
echo $ssh->read('root@machine:~$');
我得到的输出是:
Last login: Tue Jun 17 12:23:01 2014 from 109.175.60.43 [root@machine ~]# [root@machine ~]# [root@machine ~]# passwd 8917f498 Changing password for user 8917f498. New password:
或者我可以用其他方式做到这一点吗?
由于
答案 0 :(得分:1)
好的,我修好了。
此代码有效:
$ssh->enablePTY();
$ssh->exec('passwd $new_user');
echo $ssh->read('password:');
$ssh->write("$new_pw\n");
$ssh->setTimeout(3);
$ssh->write("$new_pw\n");
$ssh->setTimeout(3);
echo $ssh->read('password changed');
答案 1 :(得分:1)
如果你自己做了passwd,在被允许设置新的pw之前,你会被提示输入旧的pw。在我的Linux系统上,我无法在没有root的情况下对另一个用户进行passwd。这可能会导致您提示输入密码。
作为一般规则,我通过使用空的$ ssh-> read()调用$ ssh-> setTimeout()来找出提示的方式。例如
$ssh->enablePTY();
$ssh->exec('sudo passwd testuser');
$ssh->setTimeout(3);
echo $ssh->read();
输出Enter new UNIX password:
。所以我这样重写了我的程序:
$ssh->enablePTY();
$ssh->exec('sudo passwd testuser');
$ssh->setTimeout(3);
$ssh->read('password:');
$ssh->write("newpw\n");
echo $ssh->read();
输出Retype new UNIX password:
。所以我随后修改了我的程序:
$ssh->enablePTY();
$ssh->exec('sudo passwd testuser');
$ssh->setTimeout(3);
$ssh->read('password:');
$ssh->write("newpw\n");
$ssh->read('password:');
$ssh->write("newpw\n");
echo $ssh->read();
输出passwd: password updated successfully
。现在我知道它有效了,我删除了$ ssh-> setTimeout(3)并更新了最后的$ ssh-> read()来获取它:
$ssh->enablePTY();
$ssh->exec('sudo passwd testuser');
$ssh->read('password:');
$ssh->write("newpw\n");
$ssh->read('password:');
$ssh->write("newpw\n");
$ssh->read('passwd:');
就是这样!它会像你的版本那样等待六秒钟来改变密码。但最后的$ ssh-> read()可能不是必需的。我会让你玩弄它。
答案 2 :(得分:0)
使用单个衬管是更好的选择。我更喜欢使用这个:
$username = 'root';
$password = 'myReallySecurePassword';
$ssh->exec(sprintf('echo "%s" | sudo passwd --stdin %s', $password, $username));
以上将适用于大多数现代Linux发行版。如果您无法以某种方式更改密码并无法运行旧版Linux发行版,请尝试以下操作:
$username = 'root';
$password = 'myReallySecurePassword';
$ssh->exec(sprintf('echo -e "%s\n%s" | passwd %s', $password, $password, $username));