Zavier's Blog

企业NAS部署(二)之实现用户自助修改密码

搭建好nas后,问题又来了,就是用户密码问题。之前部署NAS,用户密码都是在命令行下导入的,修改密码也只能通过命令行,要让用户使用Linux命令行来修改或者重置密码,那是不可能的。而我唯一能想到的,就是用php写一个web页面,通过表单提交的方式,让php来替用户执行shell命令,达到自助修改密码的目的。

下载.jpg


PHP代码


<?php
       
    function replaceSpecialChar($strParam){
    $regex = "/\ |\/|\~|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\_|\+|\{|\}|\:|\<|\>|\?|\[|\]|\,|\.|\/|\;|\'|\`|\-|\=|\\\|\|/";
    return preg_replace($regex,"",$strParam);
}
?>
<html>
<head>
    <meta charset="utf-8">
    <title>NAS密码自助修改页面</title>
</head>
<body bgcolor="#CCFFCC">
  <br><br>
 <p><center><h2>NAS密码自助修改</h2></center></p>
 <form action="changepass.php" method="POST" submit=""><center> 
 <p><span>NAS用户名:</span><input type="text" name="username"  placeholder="用户名"></p>
 <p><span>NAS新密码:</span><input type="password" name="passwd" placeholder="新密码"></p>
 <p><button>修改</button></p>
 </center></form>
<br><br>
<p><h2>操作说明</h2></p>
<li>请勿使用特殊字符作为账户名或密码,使用特殊字符将导致密码错误。</li>
<li>该系统仅可修改已注册用户的密码,无法添加新用户。</li>
<?php 
    $username=$_POST["username"];
    $username=replaceSpecialChar($username);
    $passwd=$_POST["passwd"];
    $passwd=replaceSpecialChar($passwd);
    if (!$_POST["username"]){
    echo "";
    }elseif (!$_POST["passwd"]){
    echo "";
    }else{
    exec("(sudo echo ".$passwd.";echo ".$passwd.") | sudo smbpasswd -s -a ".$username."");
    echo "<br><strong>操作提示:</strong>修改成功,当前用户名".$username."对应的密码已被修改为".$passwd.",请牢记。";
    }
?>
</body>
</html>



使用说明

要求的环境:php+nginx,关于二者的编译与安装,在本站https://zavierlab.com/post/49.html这个页面里已有详细说明,不再重复写。

通过编译安装的php,其配置文件在/usr/local/php/etc/php.ini里面,要想使用php执行shell命令,就必须确保配置里面exec函数没有被禁用。查看办法是打开该配置文件,找到disable_function = 这一行(一般在305行),等号后面的函数表示被禁用的函数。

该代码内使用到了sudo命令,所以必须给php使用的用户适当的sudo免密码权限,以确保能够正常执行echo和smbpasswd命令。假设php是以www用户身份运行的,则必须给www用户适当的sudo权限,方法是:

使用vi在/etc/sudoers.d/下创建一个名为www的文件并编辑

vi /etc/sudoers.d/www
加入以下内容
#分别设置echo和smbpasswd命令的别名
Cmnd_Alias CHANGE_SMBPASS = /usr/bin/smbpasswd
Cmnd_Alias ECHO = /bin/echo
#设置www用户在执行smbpasswd和echo命令时,无需密码
www ALL=(ALL) NOPASSWD:CHANGE_SMBPASS,ECHO

编辑后保存即可生效。

接下来还需要用nginx配置web服务器并对php代码进行解析,配置如下:

现在/home/wwwroot/下创建一个changenaspwd目录,将该php文件传入目录内,且将该文件命名为index.php

mkdir -p /home/wwwroot/changenaspwd

在/usr/local/nginx/conf/vhost/下创建一个文件,文件名自定义,扩展名必须为.conf

vi /usr/local/nginx/conf/vhost/changenaspwd.conf

配置文件如下:

server
  {
  listen 80 default;
   access_log /home/wwwlogs/changenaspwd.log;
  root /home/wwwroot/changenaspwd;
  index index.php;
  location ~ [^/]\.php(/|$)
   {
     fastcgi_pass  unix:/tmp/php-cgi.sock;
     fastcgi_index index.php;
     include fastcgi.conf;
   }
}

保存后,同时启动php和nginx

service nginx start
service php-fpm start








发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Copyright © 2017-2019 Zavier的博客.网站地图