使用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”的口令。 我在做什么错?

感谢

+0

另一个是错的,像所有的答案尝试解决,passwd命令是错误的。至少在我的书中,你不能只在命令行上写出新的密码。 – 2013-03-04 10:51:53

我不够用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(),这有点难,但确实提供了双向支持。

+0

我没有得到这种方法工作。即使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"); 
?> 
+0

根据您当前的代码,脚本是否会尝试将其新密码作​​为其当前密码发送?这是没有意义的,除非用户将他们的新密码设置为与他们的旧密码相同... – 2011-10-17 15:32:35

+0

此外,此脚本失败,因为当使用`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`; 

我喜欢用2个独立的过程:http://sylnsr.blogspot.com/2012/09/keep-unix-password-in-sync-with.html比shell访问方法