1. 程式人生 > 實用技巧 >12.su 命令與sudo 服務

12.su 命令與sudo 服務

1.su 命令:解決切換使用者身份的需求,使得當前使用者在不退出登入的情況下,順暢地切換到其他使用者。

比如從root 管理員切換至普通使用者:

[root@Centos test]# id
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[root@Centos test]# su - centos
Last login: Fri Aug 14 18:37:52 CST 2020 on pts/2
[centos@Centos ~]$ id
uid=1112
(centos) gid=1113(centos) groups=1113(centos) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

su 命令與使用者名稱之間有一個減號(-),這意味著完全切換到新的使用者,即把環境變數資訊也變更為新使用者的相應資訊,而不是保留原始的資訊。

當從root 管理員切換到普通使用者時是不需要密碼驗證的,而從普通使用者切換成root管理員就需要進行密碼驗證了。

[centos@Centos ~]$ su root
Password: 
[centos@Centos ~]$ exit
logout
[root@Centos test]# 
su - centos Last login: Fri Aug 14 18:44:20 CST 2020 on pts/2

2.sudo :給普通使用者提供額外的許可權來完成原本root 管理員才能完成的任務,格式為“sudo [引數] 命令名稱”。

sudo 服務的配置原則:在保證普通使用者完成相應工作的前提下,儘可能少地賦予額外的許可權。

[centos@Centos ~]$ sudo -l
[sudo] password for centos: 
Sorry, user centos may not run sudo on Centos.

sudo 命令具有如下功能:

限制使用者執行指定的命令:記錄使用者執行的每一條命令;

配置檔案(/etc/sudoers)提供集中的使用者管理、許可權與主機等引數;

驗證密碼的後 5 分鐘內(預設值)無須再讓使用者再次驗證密碼。

如果擔心直接修改配置檔案會出現問題,則可以使用sudo 命令提供的visudo 命令來配置使用者許可權。這條命令在配置使用者許可權時將禁止多個使用者同時修改sudoers 配置檔案,還可以對配置檔案內的引數進行語法檢查,並在發現引數錯誤時進行報錯。

注:只有 root 管理員才可以使用visudo 命令編輯sudo 服務的配置檔案。

使用 visudo 命令配置sudo 命令的配置檔案時,其操作方法與Vim 編輯器中用到的方法一致。

在sudo 命令的配置檔案中,按照下面的格式將第90行(大約)填寫上指定的資訊:誰可以使用 允許使用的主機=(以誰的身份) 可執行命令的列表

[root@Centos test]# visudo
90 ##
91 ## Allow root to run any commands anywhere
92 root    ALL=(ALL)       ALL
93 centos ALL=(ALL) ALL

在填寫完畢後記得要先儲存再退出,然後切換至指定的普通使用者身份,此時就可以用sudo-l 命令檢視到所有可執行的命令了(下面的命令中,驗證的是該普通使用者的密碼,而不是root管理員的密碼):

[centos@Centos ~]$ sudo -l
[sudo] password for centos: 
Matching Defaults entries for centos on Centos:
    !visiblepw, always_set_home, match_group_by_gid, env_reset, env_keep="COLORS DISPLAY HOSTNAME
    HISTSIZE KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE",
    env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY
    LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS
    _XKB_CHARSET XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin

User centos may run the following commands on Centos:
    (ALL) ALL

測試:

[root@Centos ~]# su - centos
Last login: Mon Aug 17 11:46:10 CST 2020 on pts/2
[centos@Centos ~]$ ls /root
-bash: cd: /root: Permission denied
[centos@Centos ~]$ 
[centos@Centos ~]$ sudo ls /root
[sudo] password for centos: 
[centos@Centos ~]$ sudo ls /root

anaconda-ks.cfg Documents findresults Music Public test

Desktop Downloads initial-setup-ks.cfg Pictures Templates Videos
一般只能賦予普通使用者具體的命令以滿足工作需求,這也受到了必要的許可權約束。如果需要讓某個使用者只能使用root 管理員的身份執行指定的命令,切記一定要給出該命令的絕對路徑,否則系統會識別不出來。我們可以先使用whereis 命令找出命令所對應的儲存路徑。
舉例:
[centos@Centos ~]$ exit
logout
[root@Centos ~]# whereis cat
cat: /usr/bin/cat /usr/share/man/man1/cat.1.gz /usr/share/man/man1p/cat.1p.gz
[root@Centos ~]# visudo
91 ## Allow root to run any commands anywhere
92 root    ALL=(ALL) ALL
93 centos ALL=(ALL)  /usr/bin/cat

[root@Centos ~]# su - centos
Last login: Mon Aug 17 11:52:33 CST 2020 on pts/2
[centos@Centos ~]$ cat /etc/shadow
cat: /etc/shadow: Permission denied
[centos@Centos ~]$ sudo cat /etc/shadow
[sudo] password for centos: 
root:$6$FItCpf70$FV4ZEntlsWO5jNif2Ndi8cbZWOqRYy

取消密碼驗證:新增NOPASSWD

[root@Centos ~]# whereis cat
cat: /usr/bin/cat /usr/share/man/man1/cat.1.gz /usr/share/man/man1p/cat.1p.gz
[root@Centos ~]# 
[root@Centos ~]# visudo
## Allow root to run any commands anywhere
root    ALL=(ALL) ALL
centos ALL=NOPASSWD:  /usr/bin/cat