重启与得到进度的两个PHP

 

 

一、重启

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的文件查找一下跟他同名的另一个文件的大小(同目录下)

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值