Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1839964
  • 博文数量: 293
  • 博客积分: 10127
  • 博客等级: 上将
  • 技术积分: 3029
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-12 19:05
文章分类

全部博文(293)

文章存档

2011年(11)

2010年(282)

我的朋友

分类: LINUX

2010-09-09 14:46:07

用sudo提高脚本程序的权限

一,为什么要用sudo?
   sudo可以提高脚本程序的权限,例如:我们曾经遇到过这种问题,
   有一些文件需要通过web程序删除,但这些文件apache又没有权限访问,
   所以删除不了,给用户使用程序带来不便
   所以,这时需要借助于sudo来提高权限
   
   备注:
   1,apache为何没有权限?
     我们先来看一下apache的用户是谁?
     执行:ps auxfww
     可以看到:
     root       601  0.0  0.0 16092   80 ?        S     2008   0:56 /usr/sbin/httpd
     nobody   27493  0.0  0.2 19032 2468 ?        S    Feb08   0:14  \_ /usr/sbin/httpd
     nobody   27494  0.0  0.4 18392 4472 ?        S    Feb08   0:13  \_ /usr/sbin/httpd
     nobody   27495  0.0  0.3 18364 3252 ?        S    Feb08   0:19  \_ /usr/sbin/httpd
     nobody   27496  0.0  0.3 23888 3216 ?        S    Feb08   0: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 ~]# yum install sudo

三,如何使用sudo?
   我举一个例子:用来删除无权限访问的图片
  
   分成三步:第一步:写一个bash脚本
          第二步:让sudo允许使用bash脚本
          第三步:在php程序中调用

   1,先写bash脚本:
      [root@store root]# vi /usr/sbin/delpic.sh
       #!/bin/bash
       rm -f $1.jpg
  
      修改权限使可被执行
      [root@store root]# chmod 755 /usr/sbin/delpic.sh

      说明:   delpic.sh中
             $1是从命令行接收到的第一个参数

   2,在修改sudo的配置文件/etc/sudoers之前,需要先使此配置文件可以被编辑
  
     我们看一下它的属性设置
     [root@store root]# ls -l /etc/sudoers
     -r--r-----    1 root     root          622 Aug 31  2007 /etc/sudoers
   
     下面设置属性,使/etc/sudoers可以被编辑,当然,编辑完成后还需要把权限恢复为原样
     [root@store root]# chmod 777 /etc/sudoers

     可以编辑了:
     [root@store root]# vi /etc/sudoers
     添加一行:
     nobody ALL = NOPASSWD: /usr/sbin/delpic.sh

     完成后再恢复配置文件原有的属性
     [root@store root]# chmod 440 /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
            //得到文件路径
       $filepath = $_GET['filepath'];
      
       //删除文件:
       system("sudo /usr/sbin/delpic.sh $filepath");

     ?>

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


四: sudo配置文件中其他项的说明:
    /etc/sudoers中默认有一行命令是未被注释掉的

    root    ALL=(ALL)     ALL
    它的作用:## Allow root to run any commands anywhere
     即:允许 root以任何用户的身份在任何主机上运行任何命令

五: 编辑/etc/sudoers的专用命令
   编辑/etc/sudoers很麻烦,需要反复修改权限,
   我们可以使用visudo进行编辑,这样可以避免修改权限,
   当然,前提是要切换到root超级用户下
   [lhd@localhost ~]$ su root
   密码:
   [root@localhost lhd]# ll /etc/sudoers
   -r--r----- 1 root root 3161 2008-05-05 /etc/sudoers
   [root@localhost lhd]# visudo

六:多学一点内容:
   如果我想在一行规则之中定义多个用户,多个主机,多个命令,应该怎么样写?有无简单的写法?
   答案是:我们可以使用别名,
   什么是别名?可以这样理解:别名就是定义了变量,然后在规则中引用变量

   看例子:
   fedora 10上面附带的
   Cmnd_Alias STORAGE = /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_Alias     MAILSERVERS = smtp, smtp2                           
   主机别名的声明                                       
   User_Alias ADMINS = jsmith, mikem   
   用户别名的声明
  
   实际应用的例子:
   %sys ALL = STORAGE
   sys这个组可以切换为root超级用户执行STORAGE这个别名所代表的命令

   别名的应用很灵活,用法也很多,如有需要,请大家自己参考手册进行更深入的学习
   别名的用法执行 man sudoers 这个命令可以看到
 
小技巧:
sudo机制用途,可以替换其他用户身份执行命令,若未指定目标用户,默认将视为root用户
格式: sudo [-u 用户名] 命令操作
例:
 [root@localhost ~]# sudo -u zhangsan /bin/touch /tmp/sudotest.file
[root@localhost ~]# ls -l /tmp/sudotest.file
-rw-r--r-- 1 zhangsan zhangsan 0 05-26 09:09 /tmp/sudotest.file
注:以 zhangsan 用户身份创建的文件属性
阅读(1831) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~