使用phpseclib解析“passwd”命令

时间:2014-06-17 16:43:20

标签: php linux ssh phpseclib libssh

我试图解析" 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: 

或者我可以用其他方式做到这一点吗?

由于

3 个答案:

答案 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));