題 如何以sudo身份附加到文件?


可能重複:
sudo無法寫入/ etc / profile 

我想要做:

echo "something" >> /etc/config_file

但是,由於只有root用戶對此文件具有寫入權限,因此我不能這樣做。但以下也行不通。

sudo echo "something" >> /etc/config_file

有沒有辦法在那種情況下附加到文件,而不必先用一個文件打開它 sudo編輯然後手動附加新內容?


224
2018-05-01 05:50


起源


我正在使用Ubuntu 9.04,並且能夠為我到目前為止所需的每個命令使用sudo。產生一個子殼工作。 - Matt Norris
密切相關: 將stdout重定向到您沒有寫入權限的文件(在Unix和Linux上)。弱相關: ls 目錄路徑顯示文件,但是 ls 用文件模式不? - Scott


答案:


適合正確任務的正確工具:'開球

tee - read from standard input and write to standard output and files

所以你的命令行變成了

% echo "output" | sudo tee -a file

的優點 tee 過度執行具有管理權限的Bash是:

  • 您不使用管理權限執行Bash
  • 只有“寫入文件”部分才能以高級權限運行
  • 引用複雜命令要容易得多

332
2018-05-01 06:25



在OS X上,T卹似乎只有一個-a標誌。 - user495470
Debian 8 tee 有 -a 追加旗幟。 - clay
使用 echo "output" | sudo tee -a file > /dev/null 如果你想跳過控制台輸出。 - Moshe Bixenshpaner
適用於WSL也適用。 - kayleeFrye_onDeck


重定向在當前shell中執行。要使用提升的權限進行重定向,必須使用提升的權限運行shell本身:

sudo bash -c "somecommand >> somefile"

40
2018-05-01 05:54





讓sudo產生一個子shell:

sudo sh -c "echo 'JAVA_HOME=/usr/lib/jvm/java-6-sun' >> /etc/profile"

在這個例子中,sudo運行“sh”,其餘的作為參數。

(這在sudo手冊頁中顯示為一個示例)


22
2017-10-13 14:23



原因是它是你的shell(像你一樣運行)進行重定向,而不是sudo。由於您沒有寫入文件的權限,因此會收到“權限被拒絕”錯誤。這個答案的作用是啟動一個以root身份運行的新shell,因此能夠寫入該文件。 - Randy Orrison
這不是正確的答案。這是一個正確的答案。對於答案中提供的邏輯,Akira有一個更好的。 - TOOGAM


我經常使用 shell HERE文件 同 sudo tee -a。有點像:

sudo tee -a /etc/profile.d/java.sh << 'EOF'
# configures JAVA
JAVA_HOME=/usr/lib/jvm/java-8-oracle
export JAVA_HOME
export PATH=$PATH:$JAVA_HOME/bin
EOF

5
2018-06-16 16:16





在我看來,這種情況下最好的是dd:

sudo dd of=/etc/profile <<< END
JAVA_HOME=/usr/lib/jvm/java-6-sun
END

4
2018-04-18 18:03





這裡的sudo和重定向可能有問題。使用您選擇的短信服務員來添加該行。

sudo nano /etc/profile

或者,你可以試試su

su
echo ‘JAVA_HOME=/usr/lib/jvm/java-6-sun’ >> /etc/profile
exit

3
2017-10-13 14:10



不幸的是,這產生了相同的結果。 - Matt Norris
su -c 'echo "JAVA_HOME=/usr/lib/jvm/java-6-sun" >> /etc/profile' 應該管用。因為沒有任何東西可以錯誤地在arg中擴展迴聲,單引用整個命令。 - quack quixote
這太妙了。現在將此作為腳本的一部分。 - Ernie Dunbar


這將無法正常您嘗試重定向(使用 >>)sudo的輸出。你真正想要做的是重定向輸出 echo。我建議您只使用自己喜歡的編輯器並手動添加該行 /etc/profile。這有額外的好處,你可以檢查是否 /etc/profile 已經設定 JAVA_HOME


0
2017-10-13 14:36





使用 -辦法:

sudo ex +'$put =\"FOO\"' -cwq /etc/profile

並替換 FOO 用你的變量追加。

在某些系統(如OS X)中, /etc/profile 文件有444權限,所以如果你仍然得到 沒有權限,首先檢查並更正權限:

sudo chmod 644 /etc/profile

然後再試一次。


0
2018-05-24 22:22