[英]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.