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);
注意:这不是为我定什么。问题仍然是一样的。
您的主要问题是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上的算法和盐参数示例。
请参阅我的编辑。 – StackOverflowNewbie 2011-03-14 03:24:22
您不应该在整个$命令中使用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";
哪个用户正在执行PHP脚本,他有权利这样做须藤useradd的没有密码? – Dukeatcoding 2013-01-30 08:57:28