我正在尝试从 PHP 创建 Linux 用户

I am trying to create Linux users from PHP

shell_exec("sudo useradd -m $username");

shell_exec("yes $password | sudo passwd $username");

上面的代码片段成功创建了用户,但没有设置密码,我是不是哪里做错了?

$username 是影子文件底部的 megan 用户

您不能调用 passwd non-interactively。期间.

不过,您 可以 useradd 提供 pre-computed 带有 -p 选项的密码散列。 [参见:man useradd]

function os_pw_hash($password) {
    $salt = base64_encode(random_bytes(12)); // 16-byte salt
    return crypt('hunter2', '$'.$salt.'$');
}

var_dump( os_pw_hash('hunter2') );

输出:

string(106) "[=11=]LIJoQz2W0vP35Ej$kg75OyhAZb9iAbqa/sO56pXs/peA8wPd4DKv5Al0FllBApBe7BvXUA6Q6fQ3bqpxfz.XH6GWnI.mH6yLfTQil1"

您还需要 运行 这个 [并且老实说 所有 您的 shell 参数] 通过 escapeshellarg() 以确保元字符已正确转义。

最后:

for this use case security is not a concern

安全始终是一个问题。对于您认为不应该的情况,这通常是 doubly 正确的。不幸的是,我有一些我信任的用户知道如何更好地利用内部应用程序中的安全漏洞以 root 权限执行命令,以避免只需要制作一张票。

不要这样做。

您希望将系统的外部部分(网页)与内部管理隔离开来。为此,您的脚本应该 能够在您设置的限制范围内创建用户。编写一个单独的脚本,它接受 2 个参数 - 一个用户名和一个密码(尽管它应该生成一个随机密码),它应用对输入的彻底验证(例如,用户名中没有'/')并给你的网络服务器 uid sudo provileges on那个脚本只有(它可以写成n PHP直接调用adduser)。

您的代码无法正常工作的原因是 passwd 在读取密码之前清除了输入缓冲区。通常它会要求输入新密码两次 - 但提示和回复因上下文而异。您可以使用其他程序来设置更一致的密码 - chpasswd 在 Linux 系统上是相当标准的 - 正如 Sammitch 所说 some 版本的 useradd 允许密码是在创建用户时指定。