我有这个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;
}
?>
不过密码不起作用。当我从终端运行它时,我得到
输入新的UNIX密码:重新键入新的UNIX口令:passwd:身份验证令牌操作错误现在肯定有更好的方法可以做到这一点,而不会在sudo中将useradd和passwd都暴露为不需要密码?
这不是一个答案,而是一个非常重要的警告。您的脚本可能允许用户完全访问您的服务器,因为他可以输入"../"作为$fullname
。将用户输入作为参数传递而不使用escapeshellarg()
是自杀。
解决问题的方法可能是创建一些crontab任务,该任务将在每个定义的时间段从数据库中创建用户。这样你的密码就不会暴露。
必须在second shell_exec
中使用双引号,否则PHP无法将转义字符转换为控制字符。