使用shell_exec('passwd')更改用户的密码

时间:2008-09-24 14:20:37

标签: php sudo shell-exec passwd

我需要能够通过网页(在受控环境中)更改用户密码。 所以,为此,我正在使用这段代码:

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

我的问题是这个脚本没有更改用户“testUser”的密码。 我做错了什么?

由于

9 个答案:

答案 0 :(得分: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");
?>

答案 1 :(得分:2)

我对PHP不熟悉,告诉你如何解决它,但问题是两个shell_exec命令完全是分开的。看起来好像你正在尝试使用第二个命令来管道输入到第一个,但这是不可能的。第一个命令应该在该进程执行之后才返回,当你运行第二个命令时,它将尝试运行程序dummyPassword,我们可能会失败。

答案 2 :(得分:2)

使用proc_open,它可以让您与进程的标准输入进行交互。

请参阅本手册中的评论:http://www.php.net/manual/en/function.proc-open.php#58044

答案 3 :(得分: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(),这有点难以使用,但确实提供双向支持。

答案 4 :(得分: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,那么他可以更改系统上的任何密码。

答案 5 :(得分:0)

您应该使用crypt()功能来加密密码。然后,您可以像usermod一样调用usermod --password username encryptedpassword计划。

加密UNIX登录密码的最常用方法是:

  

crypt('password','$ 1 $ salt1234 $')

Where salt1234是八字母盐)

答案 6 :(得分:0)

我知道并且有效(至少对于Debian 4.0r5)是:

#!/bin/bash

USER="root"
NEWPASS="bullsheit123"

echo $USER:$NEWPASS | chpasswd
echo $?

只需将其改编为php脚本,它应该可以正常工作。

答案 7 :(得分:0)

我现在为时已晚,但这仍适合那些仍在寻找答案的人。这就是我们使用的。非常简单。

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

答案 8 :(得分:0)