useradd - 不与-p选项一起工作

问题描述:

我有一个正在尝试添加用户的PHP脚本。这里有一个简单的代码片段:useradd - 不与-p选项一起工作

<?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文件中看不到密码。我的直觉是我以某种方式错误地设置了密码。

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

UPDATE:

当我创建通过命令行的用户,并添加使用passwd命令口令,加密的字符串我看到在/ etc/shadow中是非常不同的是什么crypt功能在我的PHP脚本生成。

更新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); 

注意:这不是为我定什么。问题仍然是一样的。

+0

哪个用户正在执行PHP脚本,他有权利这样做须藤useradd的没有密码? – Dukeatcoding 2013-01-30 08:57:28

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

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

但是,你应该使用每个escapeshellcmd() preferrably。

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

请参阅http://php.net/crypt上的算法和盐参数示例。

+0

请参阅我的编辑。 – StackOverflowNewbie 2011-03-14 03:24:22

+0

您不应该在整个$命令中使用escapeshellcmd,而是单独使用每个参数($ username,$ password)。但现在就离开它。引用足以让它起作用。 – mario 2011-03-14 03:28:26

尝试用Perl脚本隐窝密码:

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