2012-12-02 127 views
6

我想使用bash進程替換sudo命令。使用bash進程替換sudo命令

例如,這裏有一個非sudo命令爲我的作品:

$ cat <(echo "installed.txt") 
installed.txt 

而這裏的命令的sudo的版本不工作:

$ sudo cat <(echo "installed.txt") 
cat: /dev/fd/63: Bad file descriptor 

讀sudo的手冊頁,似乎sudo在作爲root運行命令之前關閉除stdin/stdout/stderr文件描述符以外的所有文件描述符。這導致我認爲bash在運行sudo命令之前創建描述符(並執行進程替換)。

我將root的shell改爲bash(而不是sh默認)。我已經測試過,以root用戶身份登錄時,該命令正常工作。它只能通過sudo命令無效。

什麼是合適的技術來實現我在這裏要做的事情? Eval,引用,sudo標誌,sudoers文件mod,其他?

回答

6

嘗試在你的shell這樣做:

$ sudo bash -c 'cat <(echo "installed.txt for UID=$UID")' 
installed.txt for UID=0 
0

最好的辦法可能是將所有內容放在一個腳本中,然後用sudo運行該腳本。

+0

一切都是單線的;我想避免需要這樣做。 –

+1

@ClaytonStanley然後使用其他(很好)答案中給出的解決方案... –

3
sudo bash -c 'cat <(echo "installed.txt")' 
+1

這也是被接受的答案,但它不是最早發佈的答案。 –

+0

我們都在瘋狂地同時打字!你無法贏得全部。更重要的是,_I_無法贏得他們! – emrys57

+0

3分鐘寫一行?哼! =) –

4

在問題中所描述的行爲是由於sudo設計。發生

$ sudo cat <(echo "installed.txt") 
cat: /dev/fd/63: Bad file descriptor 

此錯誤的原因sudo具有關閉文件描述符除了標準輸入,輸出和誤差的默認行爲。如手冊頁所述:

默認情況下,執行命令時,sudo將關閉標準輸入,標準輸出和標準錯誤以外的所有打開文件描述符。

這種行爲可以用指定的文件描述符數低於該文件不應該關閉-C(或--close-from)選項覆蓋。然而,使用這個選項必須由管理員被允許:以下需要被添加到/etc/sudoers

Defaults closefrom_override 

有了到位,該命令將工作,如果使用-C

$ sudo -C64 cat <(echo "installed.txt") 
installed.txt 

(這裏給出的數字是64,因爲它大於錯誤消息中的63)。