平常使用Linux的時候,都是用普通使用者登入執行命令,但是有些命令需要root許可權才能執行,如果切換到root使用者去執行,就需要輸入root密碼,為了系統的安全性,應該儘可能少的直接在終端上輸入root密碼,那有沒有普通使用者不需要root密碼也能執行root許可權命令的方法呢,本文將要要介紹的 sudo 命令就是專門解決這種問題的
sudo 命令可以提升普通使用者的許可權,去執行其他使用者才有許可權執行的命令,並且執行過程中不需要輸入其他使用者的密碼,這個普通使用者能執行哪些命令,執行命令時是否需要輸入密碼等是通過 /etc/sudoers
組態檔控制的
可以使用 vim
以及 visudo
編輯 /etc/sudoers
組態檔
vim
是常用編輯工具,而 visudo
是專門編輯 /etc/sudoers
的工具,它會對 /etc/sudoers
檔案做語法檢查以及是否存在多個終端同時編輯的檢查,所以推薦使用visudo
修改組態檔
使用visudo
修改/etc/sudoers
,如果檔案存在語法錯誤,在儲存的時候會有相關的提示
下面的設定在儲存時提示 第 121 行附近有語法錯誤,如果使用 vim
編輯就不會有這個提示了
119 ## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)
120 #includedir /etc/sudoers.d
121 tt ALL=ls /home/ta/data
"/etc/sudoers.tmp" 121L, 4352C written
>>> /etc/sudoers: 語法錯誤 near line 121 <<<
現在做什麼?
選項有:
重新編輯 sudoers 檔案(e)
退出,不儲存對 sudoers 檔案的更改(x)
退出並將更改儲存到 sudoers 檔案(危險!)(Q)
現在做什麼?
當一個終端正在修改組態檔時,其他終端輸入 visudo
時會出現下面的錯誤
[root@ecs-centos-7 ~]# visudo
visudo: /etc/sudoers 忙,請稍後重試
此時, 要麼等待編輯完組態檔,再對它進行編輯,要麼使用 kill -9 程序ID
強制關閉 正在編輯的程序
下面的例子中, 系統允許 tt
使用者重啟 mysql
[tt@ecs-centos-7 ~]$ sudo systemctl restart mysqld
[sudo] tt 的密碼:
[tt@ecs-centos-7 ~]$ systemctl status mysqld
● mysqld.service - MySQL Server
Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
Active: active (running) since 一 2020-11-20 23:01:26 CST; 16s ago
Docs: man:mysqld(8)
http://dev.mysql.com/doc/refman/en/using-systemd.html
Process: 10780 ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid $MYSQLD_OPTS (code=exited, status=0/SUCCESS)
Process: 10762 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
Main PID: 10784 (mysqld)
CGroup: /system.slice/mysqld.service
└─10784 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
[tt@ecs-centos-7 ~]$
tt
使用者通過 sudo systemctl restart mysqld
命令重啟mysql, 在重啟 mysql 之前,sudo
會提示輸入 tt
使用者的密碼,然後才執行重啟命令
上面是如何做到的呢,只需要在 /etc/sudoers
檔案末尾加上 tt ALL=/usr/bin/systemctl restart mysqld
即可
如果想tt
使用者組有許可權執行 sudo systemctl restart mysqld
命令, 把設定改成 %tt ALL=/usr/bin/systemctl restart mysqld
即可
如果想 tt
使用者組都有許可權執行 sudo systemctl restart mysqld
命令, 並且執行所有命令都不用輸入密碼,把設定改成 %tt ALL=/usr/bin/systemctl restart mysqld , NOPASSWD: ALL
即可
當用戶第一次執行 sudo
命令輸入密碼之後,預設五分鐘內再次執行命令不需要輸入密碼
可以執行 sudo -k
命令清空密碼快取,這樣每次執行 sudo
命令都需要輸入密碼
sudo
密碼有效期預設是五分鐘,我們通過新增以下設定來修改預設有效期為10分鐘
Defaults timestamp_timeout=10
如果你想只針對指定使用者設定密碼有效期,下面的設定是修改tt
使用者的sudo
密碼有效期為10分鐘
Defaults:tt timestamp_timeout=10
有時需要知道一個使用者允許執行哪些 sudo
命令,這時可以使用 -l
選項列出使用者可執行的所有命令
[tt@ecs-centos-7 ~]$ sudo -l
[sudo] tt 的密碼:
匹配 %2$s 上 %1$s 的預設條目:
!visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin, 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
使用者 tt 可以在 ecs-centos-7 上執行以下命令:
(root) /usr/bin/systemctl restart mysqld, /bin/ls /home/ta/data
從上面的例子中可以知道,tt
使用者可以執行 /usr/bin/systemctl restart mysqld
和 /bin/ls /home/ta/data
命令
如果一個使用者或者使用者組可以執行的sudo
命令太多了的話,可以使用 sudo -ll
命令輸出一個長列表的形式來展示
如果想檢視指定使用者可以執行哪些root許可權的命令,可以輸入 sudo -U 使用者名稱 -l
檢視
有時候需要把 sudo
命令作為後臺任務執行,此時就不希望有輸入密碼的互動操作,-n
選項表示非互動式,它將在不輸入密碼的情況下執行命令
[tt@ecs-centos-7 ~]$ sudo -n ls /home/ta/data
a.txt
[tt@ecs-centos-7 ~]$
上面的命令 sudo -n ls /home/ta/data
是檢視 /home/ta/data
目錄,命令執行過程中不需要輸入sudo 密碼
本文介紹了 sudo 命令的一些常見用法,更多的sudo的用法請檢視 man sudo
或者 info sudo
命令的介紹