用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
     <?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 用戶身份創建的文件屬性

發佈了13 篇原創文章 · 獲贊 10 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章