sudoとしてファイルに追加する方法は?


271

私はやってみたいです:

echo "something" >> /etc/config_file

しかし、このファイルへの書き込み権限を持っているのはrootユーザーだけなので、それはできません。しかし、以下も機能しません。

sudo echo "something" >> /etc/config_file

最初にsudo「d」エディターでファイルを開いてから、新しいコンテンツを手動で追加することなく、そのような状況でファイルに追加する方法はありますか?


私はUbuntu 9.04を使用しており、これまで必要だったすべてのコマンドにsudoを使用できます。サブシェルの生成は機能しました。
マットノリス

回答:


391

使用tee -a(またはtee --appendsudo

tee - read from standard input and write to standard output and files
[...]
   -a, --append
      append to the given FILEs, do not overwrite
[...]

だからあなたのコマンドは

echo "something" | sudo tee -a /etc/config_file

tee管理者権限でBashを実行することの利点は次のとおりです。

  • 管理者権限でBashを実行しない
  • 「ファイルへの書き込み」部分のみが高度な権限で実行されます
  • 複雑なコマンドの引用ははるかに簡単です

2
OS Xでは、teeには-aフラグのみがあるようです。
リリ

Debian 8 teeには-a追加フラグがあります。
粘土

9
echo "output" | sudo tee -a file > /dev/nullコンソール出力をスキップする場合に使用します。
モシェビクセンシュパナー

WSLでも同様に機能します。
kayleeFrye_onDeck

50

リダイレクトは現在のシェルで実行されます。昇格した特権でリダイレクトを行うには、昇格した特権でシェル自体を実行する必要があります。

sudo bash -c "somecommand >> somefile"

26

sudoにサブシェルを生成させます:

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

この例では、sudoは残りを引数として「sh」を実行します。

(これは、sudoのmanページに例として示されています)


8
その理由は、sudoではなく、あなたのシェル(あなたとして実行している)がリダイレクトを行うからです。ファイルへの書き込み権限がないため、Permission deniedエラーが発生します。この答えは、rootとして実行されている新しいシェルを起動することで、ファイルに書き込むことができます。
ランディオリソン

これは正しい答えではありません。これは正解です。その答えで提供されているロジックのために、Akiraの方が優れています。
TOOGAM


4

私の意見では、この場合のベストはddです:

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

3

ここのsudoとリダイレクトに問題がある可能性があります。代わりに、選択したテキストエディターを使用して行を追加します。

sudo nano /etc/profile

または、代わりにsuを試すことができます

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

残念ながら、これは同じ結果をもたらしました。
マットノリス

1
su -c 'echo "JAVA_HOME=/usr/lib/jvm/java-6-sun" >> /etc/profile'動作するはずです。シェルが誤って引数に展開してエコーすることはできないため、コマンド全体を単一引用符で囲みます。
いんちきのキホーテ2009年

それは素晴らしいです。これをスクリプトの一部として実行します。
アーニーダンバー

0

>>sudoの出力をリダイレクト(を使用)しようとすると、これは機能しません。本当にやりたいのは、の出力をリダイレクトすることですecho。お気に入りのエディターを使用し、その行を手動でに追加することをお勧めします/etc/profile。これには、/etc/profileすでに設定されてJAVA_HOMEいるかどうかを確認できるという追加の利点があります。


0

ex -wayを使用:

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

FOO追加する変数に置き換えます。

一部のシステム(OS Xなど)では、/etc/profileファイルに444のアクセス権があるため、アクセス権がまだ拒否されている場合は、まずアクセス権を確認して修正してください。

sudo chmod 644 /etc/profile

もう一度やり直してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.