3

(制御された環境で)Webページを介してユーザーのパスワードを変更できる必要があります。したがって、そのために、私はこのコードを使用しています:

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

私の問題は、このスクリプトがユーザー「testUser」のパスワードを変更していないことです。私は何が間違っているのですか?

ありがとう

4

9 に答える 9

3

もう 1 つのオプションは、次のようなシェル スクリプトを使用することです。

#!/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");
?>
于 2008-09-24T14:42:55.313 に答える
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を制御できるようになると、システム上の任意のパスワードを変更できます。

于 2008-09-24T14:52:02.420 に答える
2

PHP の修正方法を説明できるほど PHP に詳しくありませんが、問題は、2 つのshell_execコマンドが完全に分離されていることです。2 番目のコマンドを使用して入力を最初のコマンドにパイプしようとしているように見えますが、それは不可能です。最初のコマンドは、そのプロセスが実行されるまで返されるべきではありません。2 番目のコマンドを実行すると、プログラムを実行しようとしますが、dummyPasswordおそらく失敗することが予想されます。

于 2008-09-24T14:24:07.950 に答える
2

proc_openを使用すると、プロセスの stdin と対話できます。

特にマニュアルでこのコメントを参照してください: http://www.php.net/manual/en/function.proc-open.php#58044

于 2008-09-24T14:35:47.517 に答える
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()には、操作が少し難しいが双方向サポートを提供する を使用する必要があります。

于 2008-09-24T14:38:38.880 に答える
0

パスワードを暗号化するには、 crypt()関数を使用する必要があります。usermod次に、このようにプログラムを呼び出すことができますusermod --password username encryptedpassword

UNIX ログイン パスワードを暗号化する最も一般的な方法は、次のようなものです。

crypt('パスワード', '$1$salt1234$')

(Where salt1234は 8 文字のソルトです)

于 2008-09-25T09:49:15.183 に答える
0

私は 2 つの別々のプロセスを使用することを好みます: http://sylnsr.blogspot.com/2012/09/keep-unix-password-in-sync-with.html

于 2012-09-20T23:13:02.707 に答える
0

手遅れですが、これはまだ答えを探している人向けです。これが私たちが使用するものです。非常にシンプルです。

    file_put_contents("passd", "$pass\n$pass\n");
    echo "$uname: $pass\n";
    `passwd $uname --stdin < passd`;
    `rm -rf passd`;
于 2011-08-03T13:16:35.813 に答える
0

私が知っていて、どれが機能するか (少なくとも Debian 4.0r5 の場合) は次のとおりです。

#!/bin/bash

USER="root"
NEWPASS="bullsheit123"

echo $USER:$NEWPASS | chpasswd
echo $?

これをphpスクリプトに適応させるだけで、うまくいくはずです。

于 2008-12-20T19:36:03.350 に答える