2008-09-24 6 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

Другим вариантом является сценарий оболочки, скажем, под названием 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

Кроме того, этот скрипт терпит неудачу, потому что при вызове `passwd` с помощью` root` он не запрашивает «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\""); 

Остерегайтесь! Если кто-то получит контроль над $ username, то он может изменить любой пароль в системе.

0

Вы должны использовать функцию crypt() для шифрования пароля. Затем вы можете позвонить по программе usermod следующим образом: usermod --password username encryptedpassword.

Наиболее распространенный способ шифрования пароля для входа в UNIX, как это:

крипта ('пароль', '$ 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`; 
Смежные вопросы