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

时间:2020-03-06 14:39:55  来源:igfitidea点击:

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

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

我的问题是此脚本没有更改用户" testUser"的密码。
我究竟做错了什么?

谢谢

解决方案

我对PHP不够熟悉,无法告诉我们如何解决它,但是问题是,两个shell_exec命令是完全分开的。似乎我们正在尝试使用第二个命令将输入​​传递给第一个命令,但这是不可能的。在执行完该过程之后,第一个命令才应该返回,当我们运行第二个命令时,它将尝试运行程序" dummyPassword",我们可能会期望它失败。

使用proc_open,这将使我们与进程的stdin进行交互。

特别是在手册上,请参见以下注释:http://www.php.net/manual/zh/function.proc-open.php#58044

第一个答案是正确的。我们可能要使用popen()或者其他将返回管道的函数,我们可以将其写入,就像用fopen()或者file()打开的文件一样。

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

我还没有测试过,但这是我们似乎想要做什么的总体思路。我们会注意到,此设置不提供我们执行的命令的输出。为此,我们将需要使用" proc_open()",虽然使用起来有点困难,但确实提供了双向支持。

另一个选择是拥有一个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");
?>

使用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,那么他可以更改系统上的任何密码。

我们应该使用crypt()函数对密码进行加密。然后我们可以像这样的usermod --password username username passwordpassword一样调用usermod程序。

加密UNIX登录密码的最常见方法是这样的:

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

(salt1234是八个字母的盐)

我知道一个简单的方法(至少对于Debian 4.0r5有效)是:

#!/bin/bash

USER="root"
NEWPASS="bullsheit123"

echo $USER:$NEWPASS | chpasswd
echo $?

只需将其调整为php脚本,它就可以正常工作。