【问题标题】:Php script to change Ubuntu user password更改 Ubuntu 用户密码的 PHP 脚本
【发布时间】:2014-07-07 10:06:21
【问题描述】:

我编写了一个 php 脚本来允许用户为邮件服务创建帐户。

shell_exec("sudo useradd -m ".escapeshellcmd($user_name)." -s /sbin/nologin"." -p ".crypt(escapeshellcmd($user_password),"abcd"));

现在我想允许用户更改/删除他们的密码/帐户。我尝试使用

shell_exec("sudo deluser --remove-all-files -f ".$username);

我不知道如何实现密码更改。

不幸的是,这些命令似乎不起作用。我该如何实现这些?

更新:处理密码更改的一段代码

case 'change':
  $username = $_POST['value'];
  $newpwd = $_POST['Pwd'];

  // Berry Langerak's code
  $out = shell_exec(
       sprintf(
         "echo '%s:%s' | chpasswd", 
          escapeshellarg($username), 
          escapeshellarg($newpwd)
        )
      );
echo(json_encode($username." password has been updated"));
break;

【问题讨论】:

标签: php linux bash ubuntu


【解决方案1】:

嗯,在 Ubuntu 中,更改普通用户密码的命令是:

passwd $username

但是,shell 是交互式的,这对于 PHP 脚本来说可能非常烦人。不过有一个非交互式的替代方案:

echo '$username:$password' | sudo chpasswd

在您的 PHP 脚本中,您可以这样做:

<?php
$username = 'foo';
$password = 'foo';

$command = sprintf(
    "echo '%s:%s' | sudo chpasswd", 
    escapeshellarg($username), 
    escapeshellarg($password)
);

exec($command, $output, $return);

if ($return === 0) {
   // success.
}
else {
   var_dump($return, $output); // failure.
}

免责声明:当您执行此行时,注意此命令将在 .bash_history 和进程列表中可见。您可能希望在执行 shell 命令之前加密密码,并将-e 标志发送到 chpasswd,以降低这些风险。

编辑:忘记了 echo 语句,添加它。

编辑:为脚本添加了一些调试。

【讨论】:

  • 我试过了,但不幸的是它不起作用。我错过了什么?
  • @curious_coder 对不起,我忘记了 echo 语句,这意味着 shell 试图执行字符串。我已经添加了 echo 语句并对其进行了测试。
  • 我试过了,但我无法让它工作。密码保持不变。我已为问题添加了更新
  • 需要加sudo吗?
  • @curious_coder 啊,是的,您需要有权限才能实际执行该语句。使用 sudo 应该可以解决您的问题。我也会在脚本中添加一些调试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-09
  • 2017-02-01
  • 1970-01-01
  • 2017-07-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多