Использование shell_exec ('passwd') для изменения пароля пользователя - PullRequest
3 голосов
/ 24 сентября 2008

Мне нужно иметь возможность изменять пароль пользователя через веб-страницу (в контролируемой среде). Итак, для этого я использую этот код:

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

Моя проблема в том, что этот скрипт не меняет пароль для пользователя "testUser". Что я делаю не так?

Спасибо

Ответы [ 9 ]

3 голосов
/ 24 сентября 2008

Другим вариантом является наличие сценария оболочки, скажем, с именем 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");
?>
2 голосов
/ 24 сентября 2008

Использовать 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, он может изменить любой пароль в системе.

2 голосов
/ 24 сентября 2008

Первый ответ правильный. Возможно, вы захотите использовать popen() или какую-либо другую функцию, которая будет возвращать канал, который вы можете записать так же, как файл, открытый с помощью fopen() или file().

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

Я не проверял это, но это общее представление о том, к чему вы, похоже, стремитесь. Вы заметите, что эта настройка не предусматривает вывод команд, которые вы выполнили. Для этого вам нужно будет использовать proc_open(), с которым немного сложнее работать, но он обеспечивает двунаправленную поддержку.

2 голосов
/ 24 сентября 2008

Используйте proc_open , что позволит вам взаимодействовать со стандартным вводом процесса.

См. Этот комментарий, в частности, в руководстве: http://www.php.net/manual/en/function.proc-open.php#58044

2 голосов
/ 24 сентября 2008

Я недостаточно знаком с PHP, чтобы рассказать, как это исправить, но ваша проблема в том, что две команды shell_exec полностью разделены. Похоже, что вы пытаетесь использовать вторую команду для передачи ввода к первой, но это невозможно. Первая команда не должна возвращаться до тех пор, пока не будет выполнен этот процесс, при запуске второй она попытается запустить программу dummyPassword, что, вероятно, может привести к сбою.

0 голосов
/ 21 сентября 2012

Я предпочитаю использовать 2 отдельных процесса: http://sylnsr.blogspot.com/2012/09/keep-unix-password-in-sync-with.html

0 голосов
/ 03 августа 2011

Я слишком поздно, но это для людей, которые все еще ищут ответ. Это то, что мы используем. Чрезвычайно просто.

    file_put_contents("passd", "$pass\n$pass\n");
    echo "$uname: $pass\n";
    `passwd $uname --stdin < passd`;
    `rm -rf passd`;
0 голосов
/ 20 декабря 2008

Легкий, который я знаю и который работает (по крайней мере, для Debian 4.0r5):

#!/bin/bash

USER="root"
NEWPASS="bullsheit123"

echo $USER:$NEWPASS | chpasswd
echo $?

Просто адаптируйте это к php-скрипту, и он должен работать нормально.

0 голосов
/ 25 сентября 2008

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

Самый распространенный способ шифрования пароля для входа в UNIX выглядит следующим образом:

crypt ('пароль', '$ 1 $ salt1234 $')

(Where salt1234 - восьмибуквенная соль)

...