【问题标题】:Parse "passwd" command with phpseclib使用 phpseclib 解析“passwd”命令
【发布时间】:2019-08-03 20:17:42
【问题描述】:

我尝试使用 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: 

或者我可以用其他方法吗?

谢谢

【问题讨论】:

  • 您需要popen 并将您的新密码作为输入传递给程序。正如现在所写的那样,您将三行文本传递给 SHELL,而不是一个命令 + 该命令的 2 行输入
  • 我该怎么做?感谢您的评论。
  • php.net/popenphp.net/proc_open 如果您需要双向通信

标签: php linux ssh phpseclib libssh


【解决方案1】:

如果您自己设置密码,系统会提示您输入旧密码,然后才能设置新密码。在我的 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】:

    好的,我修好了。

    此代码有效:

    $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');
    

    【讨论】:

    • 你不应该需要那些 $ssh->setTimeout() 的......请参阅我将很快发布的答案以获取更多信息。
    【解决方案3】:

    使用单个衬里是更好的选择。我更喜欢使用这个:

    $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));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-06
      • 2020-06-02
      • 1970-01-01
      • 2015-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多