2008-09-24 64 views
3

我需要能夠通過網頁(在受控環境中)更改用戶的密碼。 所以,對於這一點,我使用這個代碼:使用shell_exec('passwd')更改用戶的密碼

<?php 
$output = shell_exec("sudo -u dummy passwd testUser testUserPassword"); 
$output2 = shell_exec("dummyPassword"); 
echo $output; 
echo $output2; 
echo "done"; 
?> 

我的問題是,這個腳本是不會改變用戶「爲testUser」的口令。 我在做什麼錯?

感謝

+0

另一個是錯的,像所有的答案嘗試解決,passwd命令是錯誤的。至少在我的書中,你不能只在命令行上寫出新的密碼。 – 2013-03-04 10:51:53

回答

2

我不夠用PHP熟悉,告訴你如何修復它,但你的問題是,這兩個shell_exec命令是完全獨立的。看起來好像你試圖使用第二個命令來管道輸入到第一個,但這是不可能的。第一個命令不應該返回,直到該進程執行完畢,當您運行第二個命令時,它將嘗試運行程序dummyPassword,我們可能預計這會失敗。

2

第一響應是正確的。您可能想要使用popen()或其他一些將返回管道的功能,您可以像寫入文件一樣使用fopen()file()

<?php 
$pipe = popen("sudo -u dummy passwd testUser testUserPassword", 'r'); 
fwrite($pipe, "dummyPasswd\r\n"); 
pclose($pipe); 
echo "done"; 
?> 

我還沒有測試過,但它是你看起來要做的一般想法。你會注意到這個設置並沒有提供你執行的命令的輸出。爲此,您需要使用proc_open(),這有點難,但確實提供了雙向支持。

+0

我沒有得到這種方法工作。即使popen模式應該是'w',並且passwd命令寫入正確。 – 2013-03-04 10:49:38

3

另一種選擇是有一個shell腳本,說叫passwd_change.sh的地方,看起來是這樣的:

#!/usr/bin/expect -f 
set username [lindex $argv 0] 
set password [lindex $argv 1] 

spawn passwd $username 
expect "(current) UNIX password: " 
send "$password\r" 
expect "Enter new UNIX password: " 
send "$password\r" 
expect "Retype new UNIX password: " 
send "$password\r" 
expect eof 
在PHP代碼

然後做:

<?php 
shell_exec("sudo -u root /path/to/passwd_change.sh testUser testUserPass"); 
?> 
+0

根據您當前的代碼,腳本是否會嘗試將其新密碼作​​爲其當前密碼發送?這是沒有意義的,除非用戶將他們的新密碼設置爲與他們的舊密碼相同... – 2011-10-17 15:32:35

+0

此外,此腳本失敗,因爲當使用`root`調用`passwd`時,它不會詢問`root `用戶輸入用戶當前的密碼。 – 2011-10-17 15:34:40

2

使用chpasswd的:

$tmpfname = tempnam('/tmp/', 'chpasswd'); 
$handle = fopen($tmpfname, "w"); 
fwrite($handle, "$username:".crypt($password)."\n"); 
fclose($handle); 
shell_exec("sudo sh -c \"chpasswd -e < $tmpfname\""); 

小心!如果有人能夠控制$用戶名,那麼他可以更改系統上的任何密碼。

0

您應該使用crypt()函數來加密密碼。然後,您可以撥打usermod程序,如usermod --password username encryptedpassword

加密UNIX登錄密碼的最常用的方法是這樣的:

的crypt( '密碼', '$ 1 $ salt1234 $')

Where salt1234是八個字母鹽)

0

我很容易知道哪些方法可行(至少在Debian 4中)。0r5)是:

#!/bin/bash 

USER="root" 
NEWPASS="bullsheit123" 

echo $USER:$NEWPASS | chpasswd 
echo $? 

只是適應這個PHP腳本,它應該工作正常。

0

我這是太晚了,但這是爲人仍然搜索答案。這是我們使用的。非常簡單。

file_put_contents("passd", "$pass\n$pass\n"); 
    echo "$uname: $pass\n"; 
    `passwd $uname --stdin < passd`; 
    `rm -rf passd`;