平常使用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
命令輸入密碼之后,默認五分鍾內再次執行命令不需要輸入密碼
可以執行 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密碼
有時候需要把 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
命令的介紹