當前位置: 首頁>>技術教程>>正文


使用`sudo`重定向輸出

, ,

問題描述

關於使用sudo和輸出重定向>,我有一個小問題。要啟用IP轉發,有人可以使用以下命令:

echo 1 > /proc/sys/net/ipv4/ip_forward

執行此命令將拒絕權限,因為它需要root權限。但是,使用sudo執行相同的命令也會給出權限被拒絕錯誤!似乎輸出重定向>不繼承前麵命令echo的權限。這是正確的嗎?

作為一種解決方法,我做:

echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward

這是最好的方法嗎?我錯過了什麽嗎?

請注意,這是一個示例,它適用於使用輸出重定向的所有命令。

最佳解決方案

您使用sudo tee的方法很好。使用sudo tee的一個好結果是管道之前執行的命令不會以root身份運行。如果您隻需要一個不需要root權限的程序輸出,那麽這很有用。

如果您不關心管道之前使用的程序的輸出(在本例中為echo 1),請將stdout重定向到/dev/null

echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward > /dev/null

以上相當於sudo sh -c 'echo 1 > /proc/sys/net/ipv4/ip_forward',區別在於echo 1以root身份運行。

如果需要附加到特權文件,可以使用sh -c 'echo 127.0.0.1 local.host >> /etc/hosts'或:

echo 127.0.0.1 local.host | sudo tee -a /etc/hosts

注意-a--append的簡寫。

次佳解決方案

一種解決方案是使用:

sudo bash -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'

但是這個沒有從父shell繼承env屬性,所以你不能使用它來例如echo $PATH來獲得你父shell中的相同結果(當然隻有你改變你的路徑屬性) 。

使用sudo -E將保留環境變量。

此外,根據https://wiki.ubuntu.com/DashAsBinSh,您最好使用sh(它是dash的符號鏈接),而不是使用bash調用它。

所以,您可以將其重寫為:

sudo -E sh -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'

第三種解決方案

我通常使用sudo bash -c技巧,或者首先執行sudo -s以保持root,然後運行重定向命令。

它不能以第一種方式工作的原因是shell首先處理重定向,然後運行sudo。由於您的shell無權訪問該文件,因此重定向失敗。

參考資料

本文由Ubuntu問答整理, 博文地址: https://ubuntuqa.com/zh-tw/article/7085.html,未經允許,請勿轉載。