0

我尝试使用 phpseclib 将“passwd”命令解析到我的机器,但它无法通过第一个密码输入。看看下面的代码。

$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: 

或者我可以用另一种方式做到这一点吗?

谢谢

4

3 回答 3

2

如果您对自己进行密码,系统会提示您输入旧密码,然后才能设置新密码。在我的 Linux 系统上,如果不执行 root,我无法对另一个用户执行 passwd。这可能会导致您也被提示输入密码。

作为一般规则,我发现提示的方法是通过 $ssh->setTimeout() 使用空的 $ssh->read() 调用。例如。

$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() 可能不是必需的。我会让你玩弄那个。

于 2014-06-17T20:23:16.793 回答
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');
于 2014-06-17T17:19:20.757 回答
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));
于 2019-08-03T12:17:42.220 回答