php:exec执行root权限与php更新svn简单解决方法

因为php是apache 没有限制的用户,所以exec权限也被限制住了,无法直接的更改,需求没必要去考虑中间使用登录再中途输入密码做法,仔细尝试发现可以这样做:

使用sudoers功能限制apache只能nopasswd形态去如 sudo /sss/kdkdk.sh 运行某个命令或是文件[认为自己写的文件更加安全,因为这样可以自己控制是否接受危险参数],写好sh脚本[仔细写这个文件,防止不小心从php边传入危险命令,php的转义cmd参数不误运行字符成命令的方法听说有安全漏洞,没用,自己使用正则只放开有限的参数],然后配置visudo只允许运行本绝对路径的sh且是nopassword形态.

--------php-------

<?php
header('content-type:text/html; charset=UTF-8');
//访问方式必须是http://www.qidizi.php/update.php/token
//请定期更改此密码
define('TOKEN',('膦协奋'));//密文
   //echo '<!--'.TOKEN.'-->';
if (empty($_SERVER['REQUEST_URI']) || ($_SERVER['REQUEST_URI'] != TOKEN)) exit();//密文不对,不允许操作

if (!empty($_POST)) {
    $path = empty($_POST['path']) ? '' : trim($_POST['path']);
    $path = preg_replace("/\s/", '', $path);
    //escapeshellarg 之类php为exec转义的方法,有安全漏洞
    
    if (!empty($path)) {//为安全考虑,只允许有限字符格式
        if ($path{0} != '/') $path = '/'.$path;//必须绝对路径
        $path = preg_replace("/[^\-\w\.\/\\\]/", '', $path);
        $cmd = 'sudo /home/afll/svn.sh '.($path).' 2>&1';//把非法字删除
    } else {
        $cmd = 'sudo /home/afll/svn.sh 2>&1';
    }
    
    $str = exec($cmd, $out, $re);
    echo '<pre>';
    print_r(array('phpExec' => $cmd, 'lastEcho' => $str, 'echo' => $out, 'exit' => $re));
    echo '</pre>';
}

?>
<br/>
<form method="POST" οnsubmit="return confirm((document.getElementById('path').value || '全部人的所有的更改') + '\n\n\n\n\n你确定要更新此范围内的修改到线上?');">
    <button style="color:red;" title="提交前有确认步骤">立刻同步修改到线上</button><br/>
    指定同步更改到线上的目录绝对路径或留空表示所有人,所有目录下所做的修改,指定格式 /var/www/其它更详细的目录路径,<span style="color:red;">详细说明与注意下面说明</span>
    <textarea id="path" name="path" style="width:100%;height:100;"><?php echo empty($_POST['path']) ? '' : $_POST['path']; ?></textarea>
</form>
<p>
<pre>
1. 同步路径输入中是任何空白(包括换行空格)形态都进行后面操作步骤:
            更新线上<span style="color:red">所有的</span>有版本控制(svn)文件到<b style="color:red">最新</b>版本,目录有以下目录的所有文件:/var/www/dx, /var/www/phpcms
2.为安全考虑,路径字符只允许使用 <b style="font-size:20px;color:red;"> _ / \ 字母 数字 . -  </b>,所以如果你实际使用的路径包含有特殊字符请改名再使用,因为没有必要使用非这类字符之外的文件名
3.路径中允许指定的是文件路径,而非只目录.
4.<b style="color:red;">禁止使用双字节(如中文)文件名,因为linux上面无法正常使用,且本更新程序无法正常工作,如果已经出现像error:不能转到utf-8的提示时,请在本地修改好文件名,提交,再叫相关人员登录ssh进行更新删除此类文件,即可继续正常使用;</b>
5.<b style = "color:red;">请提交前仔细考虑清楚你本次更新的范围如果有文件修改错误将造成什么后果再进行提交,可能严重到加载了无条件限制的数据库删除语句,把整个数据表清空了.</b>
6.每次的更新请仔细看一下返回的提示,发现疑问请别关闭浏览器,复制提示请了解的同事帮忙.
7.本程序只是做了把你指定的范围内的文件换成了你们本地上最后修改的样子.
8.我们的提交过程是这样的:自己的电脑修改好 -> 提交到中间服务器存放 -> 再使用本程序把中间服务器上最新的修改放到线上服务器,所以本程序只能更新到中间服务器上的最新状态.
</pre>
</p>

------运行返回----

Array( [cmd] => sudo /home/update.sh "/var/www/php/" 2>&1 [exec_return] => Updated to revision 17502. [exec_out] => Array ( [0] => U /var/www/php/404.css [1] => Updated to revision 17502. ) [exe_re] => 0)

 

------------------------------------------update.sh----------

root@d:/home/# vi update.sh
#! /bin/bash

if [ -n "$1" ];then #set update path and exist,then only update this path
        if [ -e "$1" ];then #only exist path
                 svn update "$1"  --username user--password pwd--non-interactive --no-auth-cache #不互动,不缓存密码
        else #do nothing
                echo "path don't exit : $1"
        fi
else #update all have svn ver path
        echo 'update all underline path:'
        echo '/var/www/php'
        echo '/var/www/dx/'        svn update "/var/www/php" "/var/www/dx" --username user--password pwd--non-interactive --no-auth-cache
fi

exit 0; #must return 0 to tell i am done!
~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值