PHP脚本更改Ubuntu用户密码

时间:2014-05-19 12:33:37

标签: php linux bash ubuntu

我编写了一个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;

1 个答案:

答案 0 :(得分:3)

好吧,在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语句,添加了它。

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