useradd - 不使用-p选项

时间:2011-03-14 02:49:38

标签: php linux

我有一个试图添加用户的PHP脚本。这是一个简化的片段:

<?php
    $groupname = 'mygroup';
    $username  = 'test';
    $password  = crypt('Pass123!');
    var_dump($password);

    $command = "sudo useradd -G $groupname $username -p $password -s /bin/false";
    var_dump($command);

    $output = array();
    $return = 0;
    exec($command, $output, $return);

    var_dump($output);
    var_dump($return);

运行此脚本后,我在/ etc / passwd文件中看到用户test。但是,我在/ etc / shadow文件中看不到密码。我的直觉是我错误地设置了密码。

任何想法我做错了什么?感谢。

更新

当我通过命令行创建用户并使用passwd命令添加密码时,我在/ etc / shadow中看到的加密字符串与我的PHP脚本中的crypt函数非常不同产生

更新2

根据mario的建议:

<?php
    $groupname = 'mygroup';
    $username  = 'test';
    $password  = crypt('Pass123!');
    var_dump($password);

    $command = "sudo useradd -G '$groupname' '$username' -p '$password' -s /bin/false";
    $command = escapeshellcmd($command);
    var_dump($command);

    $output = array();
    $return = 0;
    exec($command, $output, $return);

    var_dump($output);
    var_dump($return);

注意:这对我来说没有任何修复。问题仍然存在。

2 个答案:

答案 0 :(得分:1)

您的主要问题是crypt()哈希通常以$1$abc..开头。并且exec()命令的参数不会被转义。至少引用它们:

$command = "sudo useradd -G '$groupname' '$username' -p '$password'  ";

但你应该优先使用escapeshellcmd()

从PHP crypt()返回的哈希值不一定与passwd实用程序生成它的哈希值相同。有不同的哈希函数。 PHP为您提供MD5版本(从$1$开始),而passwd可能默认生成SHA512哈希值(从$6$开始)。

使用算法和salt参数查看http://php.net/crypt上的示例。

答案 1 :(得分:0)

尝试使用perl脚本加密密码:

$command = "sudo useradd -G ".$groupname." ".$username." -p $(perl -e 'print crypt($ARGV[0], \"password\")' ".password.") -s /bin/false";