簡體   English   中英

使用 bash 進程替換 sudo 命令

[英]Using bash process substitution for a sudo command

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

例如,這是一個對我有用的非 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 文件模塊,其他?

問題中描述的行為是由於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 )。

嘗試在您的 shell 中執行此操作:

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

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

如果您要求進程替換它帶來的安全性,例如從進程列表中隱藏密碼,那么您最好這樣做:

cat <(echo -n "$PASSWORD") | sudo cryptsetup ... --key-file -

當然,密碼是通過它的stdin發送到sudo ,所以進程替換不是按照要求sudo完成的。 我的回答在技術上變得離題了。

我仍然希望它在這個特定的上下文中有所幫助,因為接受的答案有嚴重的缺點:您需要構建一個正確引用的字符串,然后生成一個輔助 shell 以在sudo解釋它。

這使得它不僅速度慢,而且由於 shell 注入、環境變量等原因而存在風險。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM