使用shell_exec('passwd')更改用户的密码
我需要能够通过网页(在受控环境中)更改用户的密码。 所以,对于这一点,我使用这个代码:使用shell_exec('passwd')更改用户的密码
<?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/en/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()
,这有点难,但确实提供了双向支持。
我没有得到这种方法工作。即使popen模式应该是'w',并且passwd命令写入正确。 – 2013-03-04 10:49:38
另一种选择是有一个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");
?>
根据您当前的代码,脚本是否会尝试将其新密码作为其当前密码发送?这是没有意义的,除非用户将他们的新密码设置为与他们的旧密码相同... – 2011-10-17 15:32:35
此外,此脚本失败,因为当使用`root`调用`passwd`时,它不会询问`root `用户输入用户当前的密码。 – 2011-10-17 15:34:40
使用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\"");
小心!如果有人能够控制$用户名,那么他可以更改系统上的任何密码。
您应该使用crypt()函数来加密密码。然后,您可以拨打usermod
程序,如usermod --password username encryptedpassword
。
加密UNIX登录密码的最常用的方法是这样的:
的crypt( '密码', '$ 1 $ salt1234 $')
(Where salt1234
是八个字母盐)
我很容易知道哪些方法可行(至少在Debian 4中)。0r5)是:
#!/bin/bash
USER="root"
NEWPASS="bullsheit123"
echo $USER:$NEWPASS | chpasswd
echo $?
只是适应这个PHP脚本,它应该工作正常。
我这是太晚了,但这是为人仍然搜索答案。这是我们使用的。非常简单。
file_put_contents("passd", "$pass\n$pass\n");
echo "$uname: $pass\n";
`passwd $uname --stdin < passd`;
`rm -rf passd`;
另一个是错的,像所有的答案尝试解决,passwd命令是错误的。至少在我的书中,你不能只在命令行上写出新的密码。 – 2013-03-04 10:51:53