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