从PHP在ubuntu中创建具有密码的用户

从PHP在ubuntu中创建具有密码的用户,php,ubuntu,sudo,Php,Ubuntu,Sudo,我有这个PHP代码 <?php error_reporting(E_ALL); ini_set('display_errors', TRUE); ini_set('display_startup_errors', TRUE); if(!empty($_GET) && !empty($_GET['user']) && !empty($_GET['mem']) && !empty($_GET['id']) &&!empty(

我有这个PHP代码

<?php
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);



if(!empty($_GET) && !empty($_GET['user']) && !empty($_GET['mem']) && !empty($_GET['id']) &&!empty($_GET['k'])) {
    $user = $_GET['user'];
    $mem = $_GET['mem'];
    $id = $_GET['id'];
    $pass = $_GET['k'];
    $fullname=  escapeshellarg($user."-".$id);

    echo $user; 
    echo $mem;
    echo $id; 
    echo $pass;
    echo "<br/>";

    mkdir("/home/servers/".$fullname, 0, true);
    $outputuser = shell_exec("sudo useradd -d /home/$fullname $fullname");
    $outputpass = shell_exec('echo -e '.$pass.'\n'.$pass.'\n" | sudo passwd '.$fullname);

    echo $outputpass;

}


?>

这不是答案,而是非常重要的警告。您的脚本可能允许用户获得对服务器的完全访问权限,因为他可以输入“./”作为
$fullname
。将用户输入作为参数传递而不使用是自杀


解决问题的方法可能是创建一些crontab任务,该任务将在每个定义的时间段从数据库创建用户。这样您的密码就不会被公开。

您必须在第二个shell_exec中使用双引号,否则PHP不会将转义字符转换为控制字符。

我理解这一点,首先,这是一个面向内部的Web服务器,从面向外部的Web服务器获取已知值,它没有最终用户控制。此时此刻,这也只是一个概念验证类型的东西,我将在代码以原始形式运行时添加安全措施。您可以添加http用户权限以使用adduser命令,但这是危险的。您的确切意思是什么?类似于
http ALL=NOPASSWD:/usr/sbin/useradd,/bin/mkdir,/bin/ln,/bin/chown,/bin/cp、/bin/sed
with
visudo
www-data
已经可以使用
useradd
passwd
而不需要sudo上的密码,它可以创建用户,但密码更改失败,因为
passwd
echo-e.$pass.\n.$pass.\n“$fullname
我明白了,但是如果不需要密码,就没有办法做到这一点吗?(可能在useradd中使用-p标志,但我不知道如何处理加密) Enter new UNIX password: Retype new UNIX password: passwd: Authentication token manipulation error