2012-07-19 68 views
4

我有一個腳本(由我的前任編寫),它成功編輯運行OS X 10.6的Mac上的sudoers文件;它是這樣的:在OS X中編輯sudoers(10.7)

#!/bin/sh 

if [ -z "$1" ]; then 
    export EDITOR=$0 && sudo -E visudo 
else 
    echo "%staff ALL=NOPASSWD: /sbin/shutdown" >> $1 
fi 

然而,當在Mac上運行的運行10.7,而不是添加一行到sudoers文件,它會啓動visudo命令,「交互」。在任何時候它似乎都沒有進入「其他」條款。我懷疑第4行(「export ...」)的適當語法已經改變,但我似乎無法找出如何。任何指針?

由於有人會問:我們有一個詳細的(並且有些愚蠢的,但必然如此)強制重新啓動計劃進行修補。如果用戶在截止日期前沒有重新啓動,應用程序將啓動5分鐘倒計時(或立即重啓選項),此時發出'sudo shutdown -r now'命令。爲了我的理智,請不要要求我捍衛這種安排的性質。這是我無法控制的。

+0

- 刪除了以前的評論;無視 - – jpdyson 2012-07-19 17:55:54

回答

1

visudo(8)有這樣一段話:

有是visudo命令,將使用設置在編譯時 可以通過編輯sudoers文件默認變量覆蓋一個或多個編輯的硬編碼列表。該列表默認爲 「/ bin/vi」。通常情況下,visudo不會遵守VISUAL或EDITOR環境變量 ,除非它們在上述編輯器列表中包含編輯器。但是,如果使用--with-env-editor選項配置visudo爲 ,或者在 sudoers中設置env_editor默認變量,visudo將使用由VISUAL或EDITOR定義的任何編輯器。請注意,這可能是一個安全漏洞,因爲它允許用戶通過設置 VISUAL或EDITOR來執行他們希望的任何程序。

我懷疑這就是你在這裏遇到的情況。

+0

我同意。我會去看看這個;然而,爲什麼它在10.6而不是10.7工作是一個謎。 10.6在我們的環境中是一個全面的,單一的圖像,而10.7更多地是一個彙總,這更加複雜。這可能是因爲我們的10.6圖像有一些其他的調整可以使用EDITOR。 – jpdyson 2012-07-19 17:29:50

+0

進一步測試 - 在我的10.6機器上,我能夠導出EDITOR =/path/to/script,echo驗證,然後運行sudo visudo - 所有操作都按預期進行(sudoers文件按預期進行了修改)。我在10.7上做了同樣的事情,回聲來驗證,但是當我運行sudo visudo時,EDITOR env var絕對被忽略(它在vi中打開)。你的理論得到證實。 – jpdyson 2012-07-19 18:01:55

2

if [ -z "$1" ];是一種常見的習慣用法,用於檢查是否沒有給出腳本參數。當調用而沒有參數時,腳本將採用第一個路徑,啓動編輯器(在這種情況下,應該是此腳本本身)。 以文件名作爲參數,採用else分支,並且非交互式地在文件中附加一行(在visudo上下文中)。

假設腳本在沒有參數的情況下被外部調用,sudo開始清除EDITOR環境變量,或者(如@twalberg指出的)visudo現在忽略EDITOR。

要修復,調整sudoers文件繼續編輯,要麼允許任何程序的編輯器通過設置env_editor,或腳本(以及任何其他腳本編輯sudoers文件)添加到editor變量。

Defaults env_keep += "EDITOR" 
# UNSAFE 
#Defaults env_editor 
# better 
Defaults editor = "/usr/bin/vi:/path/to/script" # ... possibly more 

如果你不希望這樣做(或不能這樣做,非交互),它是安全的假設,同步編輯不會發生,你可以這樣做以下:

cp -p /etc/sudoers /etc/sudoers.tmp 
echo "%staff ALL=NOPASSWD: /sbin/shutdown" >> /etc/sudoers.tmp 
if visudo -cqf /etc/sudoers.tmp; then 
    mv /etc/sudoers.tmp /etc/sudoers 
else 
    rm /etc/sudoers.tmp 
    echo "update failed" 
fi 
+0

/etc已經(在10.6和10.7中)建立到/ private/etc的符號鏈接,這是sudoers所在的位置。我也試過指定/ private/etc/sudoers,但得到相同的結果 - 打開sudoers文件,而不是編輯。 – jpdyson 2012-07-19 14:45:18

+0

嘗試直接運行'echo「%staff ALL = NOPASSWD:/ sbin/shutdown」>>/private/etc/sudoers'(當然,您可能需要root)。如果是這樣的話,用這個單行代碼替換對腳本的調用(即刪除圍繞該命令的'if',包括不需要的分支)。 – nobody 2012-07-19 14:48:59

+0

這很有效,但它可能不是超級明智的,因爲它繞過visudo。我還沒有提到我們使用Casper Suite來部署所有這些以root身份運行所有腳本的東西,所以這沒有問題。 – jpdyson 2012-07-19 17:28:23