用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这个命令可以看到