用sudo提高脚本程序的权限

用sudo提高脚本程序的权限

一,为什么要用sudo?

sudo可以提高脚本程序的权限,例如:我们曾经遇到过这种问题,

有一些文件需要通过web程序删除,但这些文件apache又没有权限访问,

所以删除不了,给用户使用程序带来不便

所以,这时需要借助于sudo来提高权限

备注:

1,apache为何没有权限?

我们先来看一下apache的用户是谁?

执行:psauxfww

可以看到:

root6010.00.01609280?S20080:56/usr/sbin/httpd

nobody274930.00.2190322468?SFeb080:14\_/usr/sbin/httpd

nobody274940.00.4183924472?SFeb080:13\_/usr/sbin/httpd

nobody274950.00.3183643252?SFeb080:19\_/usr/sbin/httpd

nobody274960.00.3238883216?SFeb080:09\_/usr/sbin/httpd

当前的apache的用户是nobody,

此设置是由apache的配置文件httpd.conf所设置的

接下来一个问题:我们何不把apache的用户设置root?

这样太不安全,因为使用sudo就意味着风险,我们把权限提得越高,出现错误的可能性就越大,也就越危险

2,apache和脚本是什么关系?

这个要看安装时的设置,因为现在一般是把php安装为apache的一个模块,

所以通过web访问php时,php的执行用户就是apache中所设置的用户

二,如何安装sudo?

一般情况下,sudo作为发行版的标准配置已经默认安装,

但也有未安装的情况,此时安装sudo这个rpm包即可

也可用yum进行安装

[root@dev~]#yuminstallsudo

三,如何使用sudo?

我举一个例子:用来删除无权限访问的图片

分成三步:第一步:写一个bash脚本

第二步:让sudo允许使用bash脚本

第三步:在php程序中调用

1,先写bash脚本:

[root@storeroot]#vi/usr/sbin/delpic.sh

#!/bin/bash

rm-f$1.jpg

修改权限使可被执行

[root@storeroot]#chmod755/usr/sbin/delpic.sh

说明:delpic.sh中

$1是从命令行接收到的第一个参数

2,在修改sudo的配置文件/etc/sudoers之前,需要先使此配置文件可以被编辑

我们看一下它的属性设置

[root@storeroot]#ls-l/etc/sudoers

-r--r-----1rootroot622Aug312007/etc/sudoers

下面设置属性,使/etc/sudoers可以被编辑,当然,编辑完成后还需要把权限恢复为原样

[root@storeroot]#chmod777/etc/sudoers

可以编辑了:

[root@storeroot]#vi/etc/sudoers

添加一行:

nobodyALL=NOPASSWD:/usr/sbin/delpic.sh

完成后再恢复配置文件原有的属性

[root@storeroot]#chmod440/etc/sudoers

说明:

添加到配置文件中的一行命令起什么作用?

注意sudoers的语法:

授权用户主机=命令动作

此三个对象,缺一不可

第一栏:nobody

此栏标明sudo的应用对象,当前例子是nobody这个用户

备注:如果是用户组,请在前面添加%号

例如:

%admin表示admin这个用户组

第二栏:ALL=

此栏指定当前规则所适用的主机,设置为ALL时表示是所有主机

等号后面可以跟上用户或用户组,如果省略掉用户或组,表示默认切换到root用户

所以此处等价于:ALL=(root)

再看一个例子:ALL=(ALL)

这个就表示能切换到所有用户

第三栏:NOPASSWD:/usr/sbin/delpic.sh

此栏指定sudo所指定用户可以执行的命令,如有多个命令,可以在此处用逗号隔开

NOPASSWD:表示无需输入密码进行验证

注意:如不加此项,则默认是需要输入密码验证的

如果是执行某个目录下所有的命令,可以利用通配符

例如:/usr/sbin/*

综述上面的内容:

nobody这个用户可以切换到root执行/usr/sbin/delpic.sh这个命令,并且在切换时无需输入密码

3,在php程序中调用我们所创建的bash脚本

delpic.php

<?php

//得到文件路径

$filepath=$_GET['filepath'];

//删除文件:

system("sudo/usr/sbin/delpic.sh$filepath");

?>

注意:

从php中调用我们所写的bash脚本时,需要在命令行前面添加sudo

四:sudo配置文件中其他项的说明:

/etc/sudoers中默认有一行命令是未被注释掉的

rootALL=(ALL)ALL

它的作用:##Allowroottorunanycommandsanywhere

即:允许root以任何用户的身份在任何主机上运行任何命令

五:编辑/etc/sudoers的专用命令

编辑/etc/sudoers很麻烦,需要反复修改权限,

我们可以使用visudo进行编辑,这样可以避免修改权限,

当然,前提是要切换到root超级用户下

[lhd@localhost~]$suroot

密码:

[root@localhostlhd]#ll/etc/sudoers

-r--r-----1rootroot31612008-05-05/etc/sudoers

[root@localhostlhd]#visudo

六:多学一点内容:

如果我想在一行规则之中定义多个用户,多个主机,多个命令,应该怎么样写?有无简单的写法?

答案是:我们可以使用别名,

什么是别名?可以这样理解:别名就是定义了变量,然后在规则中引用变量

看例子:

fedora10上面附带的

Cmnd_AliasSTORAGE=/sbin/fdisk,/sbin/sfdisk,/sbin/parted,/sbin/partprobe,/bin/mount,/bin/umount

Cmnd_Alias关键字用来声名命令的别名

STORAGE是别名的名字,实际代表的命令是/sbin/fdisk,/sbin/sfdisk,/sbin/parted,/sbin/partprobe,/bin/mount,/bin/umount

再看两个

Host_AliasMAILSERVERS=smtp,smtp2

主机别名的声明

User_AliasADMINS=jsmith,mikem

用户别名的声明

实际应用的例子:

%sysALL=STORAGE

sys这个组可以切换为root超级用户执行STORAGE这个别名所代表的命令

别名的应用很灵活,用法也很多,如有需要,请大家自己参考手册进行更深入的学习

别名的用法执行mansudoers这个命令可以看到

相关推荐