Linux下 sudo命令


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM