Linux下 sudo命令

2021-05-12 07:56:05

平常使用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 命令的介紹