web-dev-qa-db-ja.com

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

私はやってみたいです:

echo "something" >> /etc/config_file

しかし、rootユーザーだけがこのファイルへの書き込み許可を持っているので、私はそれができません。しかし、以下もうまくいきません。

Sudo echo "something" >> /etc/config_file

そのような状況で最初にSudonameまたは__エディターでファイルを開き、次に新しいコンテンツを手動で追加する必要なしにファイルに追加する方法はありますか?

262
hsribei

適切なタスクのための適切なツール: ' tee '

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

コマンドラインは

% echo "output" | Sudo tee -a file

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

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

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

Sudo bash -c "somecommand >> somefile"

Sudoにsub-shellを生成させる:

Sudo sh -c "echo 'Java_HOME=/usr/lib/jvm/Java-6-Sun' >> /etc/profile"

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

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

26
Doug Harris

私は通常 シェル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
6

私の意見では、この場合の最良のものはddです。

Sudo dd of=/etc/profile <<< END
Java_HOME=/usr/lib/jvm/Java-6-Sun
END
4
user316693

ここSudoとリダイレクトの問題があるかもしれません。行を追加するのではなく、あなたが選んだテキストエディタを使ってください。

Sudo nano /etc/profile

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

su
echo ‘Java_HOME=/usr/lib/jvm/Java-6-Sun’ >> /etc/profile
exit
3
Bobby

ex - wayを使います。

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

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

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

Sudo chmod 644 /etc/profile

それからもう一度やり直してください。

0
kenorb

Sudoの出力を(>>を使って)リダイレクトしようとしているのであれば、これはうまくいきません。本当にやりたいことはechoの出力をリダイレクトすることです。私はあなたが単にあなたの好きなエディタを使って手動で/etc/profileにその行を追加することを勧めます。これには、/etc/profileが既にJava_HOMEを設定しているかどうかを確認できるという追加の利点があります。

0
innaM