一,爲什麼要用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 這個命令可以看到
[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 用戶身份創建的文件屬性