出於管理與安全的需要,有時候需要切換到root賬號或其它賬號以進行相關的工作。有兩個命令可以實現用戶的切換,su與sudo。 su的使用很簡單: su [OPTION]... [USER [ARG]...] 沒有指定用戶則是?認切換到root。su?認是非no-login shell方式執行的,若讓它以login shell方式執行,則要帶上-l或-(dash)選項執行。我現在的理解這兩種shell的區別就是login shell能得到目標用戶環境。 如果以su切換到root,需要用戶輸入root的密碼,這顯然是不合理的。而sudo允許一個在/etc/sudoers被授權的用戶以root或其它用戶的身份來執行命令,只需要自己的密碼或者不用密碼。 如果簡單的要讓一個用戶能使用sudo來執行命令,只需要在/etc/sudoers里添加這樣一行就行,建議的是用visudo命令來編輯這個文件,說是為了語法的正確: ALL ALL = (ALL) ALL 或者更簡單寫成這樣: ALL ALL = ALL 你可以用sudo -v來測試你是否已經在/etc/sudoers被授權。sudo為了安全,?認15分鐘之後本次的授權就會超時,若要繼續就要重新驗證身份。這條命令的作用就是更新用戶的時間戳,而不執行命令。 $ sudo -v Sorry, user Guin may not run sudo. <==Guin未被授權 $ sudo -v [sudo] password for Guin: <==待我『su -』到root添加上述語句之後可用
sudoers里用戶授權規則的語法形式就是上面這條語句這個樣子的。ALL是sudoers里的一個關鍵字,它匹配一切。sudoers里授權規則的基本結構可以描述為: 誰 在哪 = (代表誰) 幹什麼 <== who where = (as_whom) what 上面這個括弧是語法里的一部分,如果要這部分,就是要加上括弧的。可以知道,ALL ALL = ALL 的意思是任何人可以在任何主機上執行任何命令。顯然這非常的BUG,對於個人也許無所謂,但對於Linux這個中央集權的世界,這種讓普通人擁有無限權利的語句是讓人非常不安的。 下面是關於sudoers這個文件內容的簡單說明。一些概念的描述會用到EBNF符號集,它的規則類似於層層剝離的來解釋東西。事實上用EBNF解釋似乎使問題更複雜,我只是覺得多了解一新事物沒什麼不好。EBNF的語法規則很簡單,是這樣的: symbol ::= definition | alternate1 | alternate2... 『::=』 這個符號的意思可以翻譯為「就是」,『|』 的意思是「或者」。這個語句解釋為:symbol這個東西就是definition,或者也可以是 alternate1, 或者也可以是 alternate2 等等。EBNF會用到一些算符,規則與正則表達式一樣:
如果需要將已存在的用戶添加到其它組中,使一個用戶被多個組支持,上面提過,也可以用adduser命令,添加新組也可以用它也可以用addgroup, groupadd這兩個命令。 # adduser guin users 正在添加用戶"guin"到"users"組... 正在將用戶「guin」加入到「users」組中 完成。 如上就使guin得到了users組的支持。用groups查看用戶屬於哪些群組,第一個便是有效群組。用id命令也可以用戶的各種信息。 # groups guin guin : guin users <==當前的有效群組是guin # id guin uid=1001(guin) gid=1001(guin) 組=1001(guin),100(users) 有效群組的意思就是用戶現在的行為代表著那個群組,比如用戶現在創建一個文件,文件的所屬群組是屬於有效群組的。用newgrp改變有效群組。newgrp的用途是?陸到新的用戶組中。如果沒指定組,則進入/etc/passwd里指定的那個真實群組。 # su guin $ newgrp users $ groups users guin <==users組排到了前面。
usermod修改一個用戶賬號,包括初始群組、屬組、?陸名、shell、家目錄、各種密碼日期等。被修改的用戶必須當前不在線。用deluser刪除用戶,命令詳細參考--help 和 info 檔。這個工具還受文件/etc/deluser.conf支配。w 查看當前?陸用戶和他們的進程。/var/run/utmp這個文件是已?陸系統用戶的信息。who查看?陸用戶的信息。?認它查看/var/run/utmp。可以提供/var/log/wtmp以查看先前?陸的用戶。lastlog報告最近?陸的所有用戶,它查看/var/log/lastlog的內容並列印。