2011-03-14 74 views
2

我有一個正在嘗試添加用戶的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

回答

1

您的主要問題是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

0

嘗試用Perl腳本隱窩密碼:

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