一、重启
php获得root权限进行重启
限制:至少半小时过后才能再次重启
要输入验证码
获取上次执行重启的时间
判断是否已经过去半小时了
system(last| grep reboot)
获取到第一行的事件
与当前事件相比
是否大于半小时
服务器设置部分:
因为要让服务器重启用到了reboot命令,但是如果不是root,使用reboot的话要使用sudo,sudo的工作过程如下
sudo的工作过程如下:
-
当用户执行sudo时,系统会主动寻找/etc/sudoers文件,判断该用户是否有执行sudo的权限
-
确认用户具有可执行sudo的权限后,让用户输入用户自己的密码确认
-
若密码输入成功,则开始执行sudo后续的命令
-
root执行sudo时不需要输入密码(eudoers文件中有配置root ALL=(ALL) ALL这样一条规则)
-
若欲切换的身份与执行者的身份相同,也不需要输入密码
那么我们这里如果需要让php执行这个sudo reboot,首先要先让php的执行者->apache2的拥有者(www-data)(可以通过ps -ef | grep apache2 查看)拥有root权限。
1.设置www-data(apache2用户)能够执行root权限
su root
visudo
添加下面这行
www-data ALL=(ALL) NOPASSWD:/sbin/reboot
关于visudo的设置请查看另外一篇文章
获得上次重启的时间(默认都是在同一年中的时候)
function getLastRebootTime(){
exec('last|grep reboot',$str);//将指令输出结果放在str这个变量中
$last = explode(" ",$str[0]);
$last_year = date("Y",time());
$last_mon = toMonth($last[8]);
$last_day = $last[9];
$last_hm = $last[10];
$last_time = $last_year."-".$last_mon."-"."$last_day"." "."$last_hm";
$last_stamp = strtotime($last_time);
return $last_stamp;
}
将英文月份缩写转化为数字
function toMonth($month){
$allMon = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'June', 'July', "Aug", "Sept", "Oct", "Nov", "De"];
foreach ($allMon as $key => $value) {
if ($value == $month) {
return $key + 1;
}
}
}
获得当前时间
function getCurrentTime(){
return time();
}
判断两个时间戳之差是否超过半小时
function ifReboot(){
$last = getLastRebootTime();
$cur = getCurrentTime();
if ($cur - $last > 1800){
echo "4";//返回码,表示可以重启
return true;
}else{
echo "5";//返回码表示时间差还小于半小时
return false;
}
}
$curHost = $_SERVER['HTTP_HOST'];
$curHost = explode(":",$curHost);
$curIp = $curHost[0];
$curPort = $curHost[1];
$code = $_POST["code"];//验证码是否正确
if ($ip === $curIp && $curPort === $curPort) {
//当前端口是预设的端口
if (isset($code)) {
if ($code == "true") {
//ip端口正确且验证码正确
if (ifReboot()) {
getRoot();
}
} else {
echo "2";//返回码,表示验证码错误
}
} else {
echo "3";//返回码,表示没有权限
}
}
验证码(用js来实现)+
使用随机数来生成
1)html部分
<form id="codeForm">
<input type="text" name="inputCode" id="inputCode">
<input type="button" onclick="createCode()" id="code">
<input type = "button" value = "验证" onclick = "validate()"/>
</form>
2)js部分
var code;
var show = <?echo json_encode($show);?>;
if (!show){
document.getElementById("codeForm").style.display = "none";
}
window.onload = function () {
createCode();
};
function createCode() {
code = "";
var codeArray = ['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'];
var current = "";
var codeLength = 4;
var cindex;
for (var i = 0;i < codeLength; i++){
cindex = Math.floor(Math.random()*62);
current = codeArray[cindex];
code = ""+code+current;
}
document.getElementById("code").value = code;
}
function validate() {
var input = document.getElementById("inputCode").value;
if (input == code){
Ajax.post("test.php","code=true",validataSuccess);
}else {
if (input == ""){
alert("请输入验证码");
} else {
alert("验证码不正确,请重新输入!");
}
}
createCode();
}
var Ajax = {
post:function (url,data,fn) {
var xhr = new XMLHttpRequest();
xhr.open('POST',url,true);
xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xhr.onreadystatechange = function () {
if (xhr.readyState == 4 && xhr.status == 200 || xhr.status == 304){
fn.call(this,xhr.responseText);
}
};
xhr.send(data);
}
}
function validataSuccess(msg) {
console.log(msg);
if (msg == 2) {
var info = "验证码错误,请重新输入";
}
if (msg == 3) {
var info = "您没有权限访问!";
}
if (msg == 5){
var info = "离上次重启还没有过去半小时,请稍后再试!";
}
if (msg == 4) {
var info = "重启中";
}
alert(info);
}
以及记录一个ajax返回码
ajax返回500代表是服务器部分出现了错误。
二、得到进度
根据一个zip的文件查找一下跟他同名的另一个文件的大小(同目录下)