Linux基礎命令—sudo

一生有你llx發表於2018-10-25
sudo

      sudo允許使用者以超級使用者或安全策略指定的另一個使用者的身份執行命令。Sudo支援安全策略外掛和輸入/輸出日誌的外掛。第三方可以開發和分發自己的策略和I/O日誌外掛,以便與sudo前端無縫地工作。預設的安全策略是sudoers,它是通過檔案/etc/sudoers或通過LDAP配置的。


      安全策略確定使用者在需要什麼權利的時候需要執行sudo。該策略可能要求使用者使用密碼或其他身份驗證機制進行身份驗證。如果需要身份驗證,如果使用者的密碼未在可配置的時限內輸入,sudo將退出。此限制是特定於策略的;sudoers安全策略的預設密碼提示超時為5分鐘。


      安全策略可能支援憑據快取,允許使用者在不需要身份驗證的情況下再次執行sudo。sudoers策略將憑據快取5分鐘,除非在sudoers(5)中重寫。通過使用“-v”選項執行sudo,使用者可以在不執行命令的情況下更新快取的憑據。


      安全策略可能記錄使用sudo的成功和失敗情況。如果配置了I/O外掛,執行中的命令的輸入和輸出也可能被記錄下來。


      此命令的適用範圍:RedHat、RHEL、Ubuntu、CentOS、SUSE、openSUSE、Fedora。

1、語法

      sudo -h | -K | -k | -V

      sudo -v  [-AknS]  [-g group name | #gid]  [-p prompt]  [-u user name | #uid]

      sudo -l[l] [-AknS]  [-g group name | #gid]  [-p prompt]  [-U user name] [-u user name | #uid]  [command]

      sudo [-AbEHnPS]  [-C fd]  [-g group name | #gid]  [-p prompt]  [-r role]  [-t type]  [-u user name | #uid]  [VAR=value]  -i |  -s [command]

      sudoedit [-AnS]  [-C fd]  [-g group name | #gid]  [-p prompt]  [-u user name | #uid]  file  …

 
2、選項列表

      -h

       幫助資訊

      -V

            顯示命令版本資訊

      -A

            通常,如果sudo需要密碼,它就會從使用者終端讀取密碼。如果指定了-A(Askpass)選項,則執行一個(可能是Graphi cal)幫助程式來讀取使用者密碼並將密碼輸出到標準輸出。如果設定了SUDO_ASKPASS環境變數,則指定助手程式的路徑。否則,如果“/etc/sudo.conf”包含了askpass程式的路徑,將使用該值。例如:

# Path to askpass helper program

Path askpass /usr/X11R6/bin/ssh-askpass

      -b

            在後臺執行命令。請注意,如果使用-b選項,則不能使用shell作業控制元件操作程式。大多數互動命令在後臺模式下都無法正常工作。

      -C fd

            通常,sudo將關閉除標準輸入、標準輸出和標準錯誤之外的所有開啟的檔案描述符。“-C”選項允許使用者在標準錯誤(檔案描述符3)之上指定起點。不允許值小於3。安全策略可能限制使用者使用“-C”選項的能力。sudoers策略僅允許使用者只有在開啟“closefrom_override”之後,才可以使用“-C”選項

      -E

            執行時保留使用者環境。“-E”選項向安全策略指示使用者希望儲存他們現有的環境變數。如果指定了“-E”選項,且使用者沒有保留環境的許可權,則安全策略可能返回錯誤

      -e

            編輯命令檔案,而不是執行命令。當查詢安全策略的時候,使用字串“sudoedit”代替命令。如果使用者通過策略認證,有3個步驟需要做:1)產生一個臨時的副本;2)執行策略指定的編輯器來編輯臨時檔案。sudoers策略依次使用環境變數SUDO_EDITOR,、VISUAL 、EDITOR。如果沒有設定這三個環境變數,則使用編輯器sudoers(5)選項中列出的第一個程式;3)如果修改了臨時檔案,則將臨時檔案複製回原來的位置,並移除臨時版本。

如果指定的檔案不存在,它將被建立。注意,與sudo執行的大多數命令不同,編輯器是在呼叫使用者的環境中執行的。如果由於某些原因,sudo無法用指定的編輯器更新檔案,則使用者將收到警告,編輯後的副本將保留在臨時檔案中。

      -g group 

            由指定的使用者組來執行命令。使用#gid,而不是組名。注意,shell要求使用反斜槓(‘’)轉義‘#’

      -H

      -H(Home)

            選項要求安全策略將“HOME”環境變數設定為由密碼資料庫指定的目標使用者的家目錄。根據策略,這個選項很可能是預設的。

      -i [command]

            模擬初始登入。“-i“選項將目標使用者的密碼資料庫條目指定的shell作為登入shell執行。這意味著shell將讀取特定於登入的資原始檔,如“.profile”或“.login”。如果指定了命令,則通過shell的-c選項將其傳遞給shell執行。如果未指定命令,則執行互動式shell。sudo試圖在執行shell之前更改到該使用者的家目錄。安全策略應將環境初始化為最小變數集,類似於使用者登入時存在的變數集。

      -K

            刪除使用者快取的憑據,不能與命令或其他選項一起使用。此選項不需要密碼。並非所有安全策略都支援憑據快取。

      -k [command]

            單獨使用時,sudo選項可以使使用者的快取憑據無效。下一次執行sudo時,將需要密碼。此選項不需要密碼,新增該選項是為了允許使用者從.logout檔案中撤消sudo許可權。並非所有安全策略都支援憑據快取。

當與可能需要密碼的命令或選項一起使用時,“-k”選項將導致sudo忽略使用者的快取憑據。因此,sudo將提示輸入密碼(如果安全策略需要密碼),並且不會更新使用者快取的憑據。

      -l[l] [command]

            列出使用者能執行的命令。如果沒有指定命令,則-l(List)選項將列出當前主機上呼叫使用者(或-u選項指定的使用者)所允許的命令。如果指定了命令並得到安全策略的允許,則會顯示命令的完全路徑以及任何命令列引數。如果指定了命令但不允許執行,sudo將退出,狀態值為1。如果使用l引數(即-ll),則使用較長的列表格式。

      -n

            非互動式,將不提示使用者。-n選項防止sudo提示使用者輸入密碼。如果執行命令需要密碼,sudo將顯示錯誤訊息並退出。

      -P

            儲存組向量。“-P“選項使sudo保持呼叫使用者的組向量不變。預設情況下,sudoers策略將組向量初始化為目標使用者所在的組列表。然而,實際有效的組ID仍然被設定為與目標使用者匹配。

      -p prompt

            使用指定的密碼提示語句:

            %H,擴充套件為主機名,包括域名;

            %h,擴充套件為主機名,不包括域名;

            %p,擴充套件為請求其密碼的使用者的名稱;

            %U,擴充套件到執行命令的使用者的登入名;

            %u,擴充套件到呼叫使用者的登入名;

            %%,兩個連續的‘%’字元摺疊成一個‘%’字元;

      -r role

            “-r“選項將導致新的安全上下文具有由role指定的角色。

      -S 

      從標準輸入讀取密碼,而不是終端獲取。密碼後面必須跟著換行符

      -s [command]

            如果設定了shell環境變數,則“-s“選項執行由shell環境變數指定的shell,或者執行密碼資料庫中指定的shell。如果指定了命令,則通過shell的”-c“選項將命令傳遞給shell執行。如果沒有指定命令,則執行互動式shell。

      -t type

            “-t“選項將導致新的安全上下文的型別,如果沒有指定型別,則從指定的角色派生預設型別。

      -U user

            “-U”選項與“-l”選項一起使用,以列出指定使用者的許可權。安全策略可能限制列出其他使用者的特權。sudoers策略只允許root或當前主機上具有完整特權的使用者使用此選項。

      -u user

            以指定的使用者身份執行指令。“-u“選項使sudo以root以外的使用者身份執行指定的命令。要指定#uid而不是使用者名稱。當以uid的形式執行命令時,許多shell要求用反斜槓‘’轉義“#”。安全策略可能會將UID限制在密碼資料庫。sudoers策略允許不存在於密碼資料庫中的UID,只要沒有設定targetpw選項。其他安全策略可能不支援這一點。

      -v

            當給定-v(驗證)選項時,sudo將更新使用者的快取憑據,必要時對使用者密碼進行身份驗證。對於sudoers外掛,這會將sudo超時再延長5分鐘(或安全策略設定的超時時間),但不會執行命令

      —

            這個選項提示,sudo應該停止處理命令列引數

 

      為命令設定的環境變數也可以var=value的形式傳遞到命令列,例如LD_Library_path=/usr/local/pkg/lib。傳遞到命令列的變數受與正常環境變數相同的限制,但有一個重要的例外。如果在sudoers中設定setenv選項,則要執行的命令具有SETENV標記集或匹配的命令。

 
3、執行命令

      當sudo執行命令時,安全策略指定命令的執行環境。通常,將實際有效的uid和gid設定為與密碼資料庫中指定的目標使用者相匹配,並根據組資料庫初始化組向量(除非指定了-p選項)。安全策略可能會指定一些引數:真實有效使用者ID、真實有效組ID、補充組ID、環境列表、當前工作目錄、檔案建立掩碼、SELinux的角色和型別、排程級別。

      1)程式模型

      當sudo執行一個命令時,它呼叫fork(2),設定上面描述的執行環境,並在子程式中呼叫execve系統呼叫。主sudo程式等待命令完成,然後將命令的退出狀態傳遞給安全策略的close方法並退出。如果配置了I/O日誌外掛,則將一個新的偽終端((“pty”)被建立,第二個sudo程式用於在使用者現有的pty和正在執行的新pty之間傳遞作業控制訊號。這個額外的程式使掛起並恢復命令成為可能。如果沒有它,命令將使用POSIX術語中的“孤立程式組”。也不會收到任何作業控制訊號

      2)訊號處理

      因為命令是作為sudo程式的子程式執行的,所以sudo會將接收到的訊號中繼到命令。除非該命令在新的pty中執行,否則SIGHUP、SIGINT和SIGQUIT訊號將不會被中繼,除非它們是由使用者程式而不是核心傳送的。否則,該命令將在使用者按下“ctrl+c”時接收到兩次SIGINT.訊號。由於SIGSTOP和SIGKILL不能被捕獲,因此不會被中繼到命令。作為一般規則,當您希望掛起sudo執行的命令時,應該使用SIGTSTP而不是SIGSTOP。

      作為特例,sudo將不會中繼它正在執行的命令傳送的訊號。這可以防止命令意外地殺死自己。在某些系統上,reboot(8)命令在重新啟動系統之前將SIGTERM傳送到所有非系統程式,而不是它自己。這防止sudo將接收到的SIGTERM訊號中繼回reboot(8),然後該訊號可能會在系統實際啟動之前退出,使其處於類似於單使用者模式的半死狀態。但是,請注意,此檢查只適用於sudo執行的命令,而不適用於命令可能建立的任何其他程式。因此,通過sudo執行呼叫重reboot(8)或shutdown(8)的指令碼可能導致系統處於這種未定義狀態,除非使用exec()函式系列而不是system()執行reboot(8)或shutdown(8)(後者在命令和呼叫程式之間插入一個shell)。

 
4、外掛

      外掛根據“/etc/sudo.conf”檔案的內容動態載入。如果沒有“/etc/sudo.conf”檔案,或者它不包含外掛行,sudo將使用傳統sudoers安全策略和I/O日誌記錄,這相當於以下“/etc/sudo.conf”檔案

      #

      # Default /etc/sudo.conf file

      #

      # Format:

      #   Plugin plugin_name plugin_path plugin_options …

      #   Path askpass /path/to/askpass

      #   Path noexec /path/to/sudo_noexec.so

      #   Debug sudo /var/log/sudo_debug all@warn

      #   Set disable_coredump true

      #

      # The plugin_path is relative to /usr/libexec unless

      #   fully qualified.

      # The plugin_name corresponds to a global symbol in the plugin

      #   that contains the plugin interface structure.

      # The plugin_options are optional.

      #

      Plugin policy_plugin sudoers.so

      Plugin io_plugin sudoers.so

      外掛行由外掛關鍵字組成,後面跟著符號名字和包含外掛的共享物件的路徑。符號名字是外掛共享物件中struct policy_plugin或struct io_plugin的名稱。路徑可以是完全限定的或相對的。如果不完全限定,則相對於“/usr/libexec”目錄。路徑之後的任何附加引數都是作為引數傳遞給外掛的開放函式。不以Plugin、Path、

Debug、Set開頭的行將被預設忽略。

 
5、路徑

      路徑行由Path關鍵字組成,後面跟著要設定的路徑的名稱及其值。例:

      Path noexec /usr/libexec/sudo_noexec.so

      Path askpass /usr/X11R6/bin/ssh-askpass

 

      以下與外掛無關的路徑可以在“/etc/sudo.conf”檔案中設定

      1)askpass,輔助程式的完全限定路徑,用於在沒有終端可用時讀取使用者的密碼。當sudo從圖形應用程式執行時,情況可能是這樣。由askpass指定的程式應該將傳遞給它的引數顯示為提示符,並將使用者的密碼寫入標準輸出。askpass可能被環境變數SUDO_ASKPASS覆蓋。

      2)noexec,共享庫的完全限定路徑,包含僅返回錯誤的execv()、execve()和fexecve()庫函式的虛擬版本,用於在支援LD_PRELOAD或其等效的系統上實現noexec功能。預設值為“/usr/libexec/sudo_noexec.so”。

 
6、除錯標誌

      Sudo版本1.8.4及更高版本支援一種靈活的除錯框架,如果存在問題,可以幫助跟蹤sudo在內部做什麼。

Debug行由Debug關鍵字組成,後面跟著要除錯的程式名稱(sudo、visudo、sudoreplay)、除錯檔名和以逗號分隔的除錯標誌列表。sudo和sudoers外掛使用的除錯標誌語法是subsystem@priority,但是外掛可以自由使用不同的格式,只要它不包括逗號。例如語句“Debug sudo /var/log/sudo_debug all@warn,plugin@info”將會在警告級別和更高階別記錄外掛子系統的所有除錯語句以及資訊級別的語句。

      目前,每個程式只支援一個除錯條目。sudo除錯條目由sudo前端、sudodit和plugins共享。將來的版本可能會增加對每個外掛除錯行的支援和/或對單個程式的多個除錯檔案的支援。

      sudo前端使用的優先順序依次為:crit、err、warn、notice、diag、info、trace、debug.。當指定每個優先順序時,還包括所有高於此優先順序的優先順序。例如,通知的優先順序將包括記錄在通知中的除錯訊息以及更高的優先順序。

      sudo前端可以使用一下子系統:

      all 

            所有的子系統。

      args

            命令列引數程式。

      conv

            使用者回會話

      edit

      sudoedit。

      exec

            命令執行過程。

      main

      sudo的主函式。

      netif

            網路介面處理。

      pcomm

            外掛會話

      plugin

      外掛配置。

      pty

            為tty相關程式碼。

      selinux

            SELinux專用處理。

      util

            實用函式。

      utmp 

            utmp處理
7、退出值

      當程式成功執行時,sudo的退出狀態將只是被執行的程式的退出狀態。否則,如果存在配置/許可權問題或sudo無法執行給定的命令,sudo將以1退出。在後一種情況下,錯誤字串將列印到標準錯誤。如果sudo無法在使用者路徑中呼叫stat函式統計一個或多個條目,則在stderr上列印錯誤。(如果該目錄不存在,或者它實際上不是一個目錄,則忽略該條目,並且不列印錯誤。)在正常情況下不應該發生這種情況。stat(2)返回“拒絕許可權”的最常見原因是,如果您正在執行一個自動偵聽器,並且您的路徑中的一個目錄位於當前無法訪問的計算機上。

 
8、安全說明

      當執行外部命令時,sudo試圖保持安全。為了防止命令欺騙,sudo在使用者路徑中搜尋命令時,最後檢查“.”和““。但是請注意,實際的path環境變數沒有被修改,而是不改變地傳遞給sudo執行的程式。

      請注意,sudo通常只記錄它顯式執行的命令。如果使用者執行“sudo su“或”sudo sh“之類的命令,則從該shell執行的後續命令不受sudo的安全策略的約束,提供shell轉義的命令也是如此。如果啟用了I/O日誌記錄,隨後的命令將有它們的輸入和輸出記錄,但這些命令不會有傳統的日誌。因此,當使用者通過sudo訪問命令時,必須小心,以驗證該命令不會無意中給使用者一個有效的root shell。

      為了防止洩露潛在的敏感資訊,sudo在執行時預設禁用核心轉儲。為了幫助除錯sudo崩潰,您可能希望通過在“/etc/sudo.conf“檔案中將“disable_coredump”設定為false來重新啟用核心轉儲,如下所示

      Set disable_coredump false

      請注意,預設情況下,大多數作業系統從setuid程式(包括sudo)禁用核心轉儲。要實際獲得sudo核心檔案,您可能需要為setuid程式啟用核心轉儲。在BSD和Linux系統上,這是通過“sysctl“命令完成的,在Solaris上可以使用”coreadm“命令。

 
9、環境變數

      sudo使用一下環境變數,安全策略控制命令環境的實際內容。

      EDITOR

            如果沒有設定SUDO_EDITOR或VISUAL,則預設編輯器使用”-e”模式。

      MAIL

            在“-i“模式中或在sudoers中啟用env_reset時,將其設定為目標使用者的郵件線軸。

      HOME

            如果指定了“-i“或”-H“,在sudoers中賦值給目標使用者的home目錄,或者賦值給env_reset或all_set_home。或者當指定”-s“選項時,sudoers中賦值給set_home。

      PATH

            可能被安全策略覆蓋

      SEHLL

            使用“-s“選項,執行執行的shell

      SUDO_ASKPASS

            如果沒有可用的終端,或者指定了“-A“選項,則指定用於讀取密碼的輔助程式的路徑。

      SUDO_COMMAND

            賦值給sudo執行的命令

      SUDO_EDITOR

            “-e“模式下的預設編輯器

      SUDO_GID

            賦值給呼叫sudo的使用者的組ID

      SUDO_PROMPT

            作為預設的密碼提示語句

      SUDO_PS1

            如果設定,PS1將被設定為正在執行的程式的值。

      SUDO_UID

            賦值給呼叫sudo的使用者的ID

      SUDO_USER

            賦值給呼叫sudo的使用者登入名

      USER

            賦值給目標使用者(預設是root,除非指定“-u“選項)

      VISUAL

            如果在“-e“模式下沒有指定”SUDO_EDITOR“,那麼這個就是預設編輯器

 
10、例項

1)檢視當前使用者支援的指令

      [weijie@192 /]$ sudo –l       //當前使用者沒有權利執行任何sudo指令

      [sudo] password for weijie: 

      對不起,使用者 weijie 不能在 192 上執行 sudo。

      You have new mail in /var/spool/mail/root

 

      [root@192 /]# sudo –l       //當前使用者是root,因此可以執行所有的sudo指令

      匹配此主機上 root 的預設條目:

          requiretty, !visiblepw, always_set_home, env_reset, env_keep=”COLORS

          DISPLAY HOSTNAME HISTSIZE INPUTRC 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

 

      使用者 root 可以在該主機上執行以下命令:

          (ALL) ALL

2)以指定的使用者身份來執行命令,不可以指定root

      [root@192 /]# sudo -u weijie ls /home/david/         //以使用者weijie的身份來檢視使用者david的家目錄,很明顯是沒有權利的

      ls: 無法開啟目錄/home/david/: 許可權不夠

      [root@192 /]# sudo -u weijie ls /home/weijie/       //以使用者weijie的身份來檢視使用者weijie的家目錄,這個當然可以

      1.zip  mail

      [root@192 /]# sudo  ls /home/david/                   //直接檢視使用者david家目錄,由於當前在root環境下,因此完全可以

      mail

3)其他例子程式碼

      $ sudo -u yaz ls ~yaz                               //檢視使用者yaz的家目錄

      $ sudo -u www vi ~www/htdocs/index.html          //以使用者www的身份編輯檔案

      $ sudo -g adm view /var/log/syslog                //以組adm的身份去檢視日誌檔案,  

      $ sudo -u jim -g audio vi ~jim/sound.txt         //要使用不同的主組以Jim的身份執行編輯器

      $ sudo shutdown -r +15 “quick reboot”             //關機

      $ sudo sh -c “cd /home ; du -s * | sort -rn > USAGE”   //若要對/home分割槽中的目錄進行使用列表,請注意,這將在子shell中執行命令,以使cd和檔案重定向工作。


相關文章