2011年1月12日 星期三

[Linux 範例] sudo (給予非root帳號有限命令權限)

Source (鳥哥) 
* sudo 的指令用法 
相對於 su 需要瞭解新切換的使用者密碼 (常常是需要 root 的密碼), sudo 的執行則僅需要自己的密碼即可! 甚至可以設定不需要密碼即可執行 sudo 呢!由於 sudo 可以讓你以其他用戶的身份執行指令 (通常是使用 root 的身份來執行指令),因此並非所有人都能夠執行 sudo , 而是僅有規範到 /etc/sudoers 內的用戶才能夠執行 sudo 這個指令喔. 
由於一開始系統預設僅有 root 可以執行 sudo ,因此底下的範例我們先以 root 的身份來執行,等到談到 visudo 時,再以一般使用者來討論其他 sudo 的用法吧! sudo 的語法如下: 

[root@www ~]# sudo [-b] [-u 新使用者帳號]
選項與參數:
-b :將後續的指令放到背景中讓系統自行執行,而不與目前的 shell 產生影響
-u :後面可以接欲切換的使用者,若無此項則代表切換身份為 root 。


範例一:你想要以 sshd 的身份在 /tmp 底下建立一個名為 mysshd 的檔案 
linux-7xud:~ # sudo -u john touch /tmp/sudotest <目前帳號為root, 以帳號john建立檔案> 
linux-7xud:~ # ll /tmp/sudotest 
-rw-r--r-- 1 john users 0 May 26 04:04 /tmp/sudotest 

範例二:你想要以 john 的身份建立 ~john/www 並於其中建立 index.html 檔案 
linux-7xud:~ # sudo -u john sh -c "cd ~/public_html/;\ 
echo 'This is index.html file' > index.html" 
linux-7xud:~ # ll -a ~john/public_html 
total 16 
drwxr-xr-x 2 john users 4096 May 26 04:09 . 
drwxr-xr-x 8 john users 4096 May 25 22:55 .. 
-rw-r--r-- 1 john users 48 May 18 00:23 .directory 
-rw-r--r-- 1 john users 24 May 26 04:09 index.html 
# 要注意,建立者的身份是 john ,且我們使用 sh -c "一串指令" 來執行的! 

sudo 可以讓你切換身份來進行某項任務,例如上面的兩個範例。範例一中,我們的 root 使用 john 的權限去進行某項任務! 要注意,因為我們無法使用『 su - sshd 』去切換系統帳號 (因為系統帳號的 shell 是 /sbin/nologin), 這個時候 sudo 真是他 X 的好用了!立刻以 john 的權限在 /tmp 底下建立檔案!查閱一下檔案權限你就瞭解意義啦! 至於範例二則更使用多重指令串 (透過分號 ; 來延續指令進行),使用 sh -c 的方法來執行一連串的指令, 如此真是好方便! 

但是 sudo 預設僅有 root 能使用啊!為什麼呢?因為 sudo 的執行是這樣的流程: 
1. 當使用者執行 sudo 時,系統於 /etc/sudoers 檔案中搜尋該使用者是否有執行 sudo 的權限;
2. 若使用者具有可執行 sudo 的權限後,便讓使用者『輸入使用者自己的密碼』來確認;
3. 若密碼輸入成功,便開始進行 sudo 後續接的指令(但 root 執行 sudo 時,不需要輸入密碼);
4. 若欲切換的身份與執行者身份相同,那也不需要輸入密碼。


所以說,sudo 執行的重點是:『能否使用 sudo 必須要看 /etc/sudoers 的設定值, 而可使用 sudo 者是透過輸入使用者自己的密碼來執行後續的指令串』喔!由於能否使用與/etc/sudoers 有關, 所以我們當然要去編輯 sudoers 檔案啦!不過,因為該檔案的內容是有一定的規範的,因此直接使用 vi 去編輯是不好的。 此時,我們得要透過 visudo 去修改這個檔案喔 

沒有留言:

張貼留言

[Git 常見問題] error: The following untracked working tree files would be overwritten by merge

  Source From  Here 方案1: // x -----删除忽略文件已经对 git 来说不识别的文件 // d -----删除未被添加到 git 的路径中的文件 // f -----强制运行 #   git clean -d -fx 方案2: 今天在服务器上  gi...