我有一个试图添加用户的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);
注意:这对我来说没有任何修复。问题仍然存在。
答案 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";