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”文件
|
插件行由插件關鍵字組成,后面跟着符號名字和包含插件的共享對象的路徑。符號名字是插件共享對象中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”模式。 |
|
在“-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)查看當前用戶支持的指令
|
2)以指定的用戶身份來執行命令,不可以指定root
|
3)其他例子代碼
|