web-dev-qa-db-ja.com

sudo echo "something" >> / etc / privilegegedFileが機能しない

これはかなり単純な質問です。少なくともLinuxでのSudoの許可についてはそうあるべきです。

/etc/hostsやそれに似たファイルに何かを追加したいだけで、rootでも>>>の両方が許可されていないためにできないことがよくあります。

suSudo suをrootにしなくてもこの動作をさせる方法はありますか?

529
David

tee --appendまたはtee -aを使用してください。

echo 'deb blah ... blah' | Sudo tee -a /etc/apt/sources.list

引用符の内側に引用符を付けないようにしてください。

データがコンソールに出力されないようにするには、出力を/ dev/nullにリダイレクトします。

echo 'deb blah ... blah' | Sudo tee -a /etc/apt/sources.list > /dev/null
762
Yoo

問題は、Sudoやechoではなく、シェルがリダイレクトを出力することです。したがって、これは通常のユーザーとして行われています。

次のコードスニペットを試してください。

Sudo sh -c "echo 'something' >> /etc/privilegedfile"
294
Matt P

問題はリダイレクトを処理するのはあなたのシェルだということです。 Sudoで実行しているプロセスではなく、your権限でファイルを開こうとしています。

おそらくこのようなものを使ってください。

Sudo sh -c "echo 'something' >> /etc/privilegedFile"
31
Incident
Sudo sh -c "echo 127.0.0.1 localhost >> /etc/hosts"
17
Vinko Vrsalovic

やる

Sudo sh -c "echo >> somefile"

うまくいくはずです。問題は、>と>>が "sudoed"コマンドではなく、あなたのシェルによって扱われることです。そのため、パーミッションはあなたのものであり、あなたが "sudo"しているユーザーのものではありません。

13
agnul

好奇心旺盛なので、大規模なブロックの場合はheredocも引用できます。

Sudo bash -c "cat <<EOIPFW >> /etc/ipfw.conf
<?xml version=\"1.0\" encoding=\"UTF-8\"?>

<plist version=\"1.0\">
  <dict>
    <key>Label</key>
    <string>com.company.ipfw</string>
    <key>Program</key>
    <string>/sbin/ipfw</string>
    <key>ProgramArguments</key>
    <array>
      <string>/sbin/ipfw</string>
      <string>-q</string>
      <string>/etc/ipfw.conf</string>
    </array>
    <key>RunAtLoad</key>
    <true></true>
  </dict>
</plist>
EOIPFW"
9
msanford

Bashでは、tee> /dev/nullと組み合わせて標準出力をきれいに保つことができます。

 echo "# comment" |  Sudo tee -a /etc/hosts > /dev/null
8

Yoo's answer を使って、これをあなたの~/.bashrcに入れてください。

sudoe() {
    [[ "$#" -ne 2 ]] && echo "Usage: sudoe <text> <file>" && return 1
    echo "$1" | Sudo tee --append "$2" > /dev/null
}

これでsudoe 'deb blah # blah' /etc/apt/sources.listを実行できます


編集:

より完全なバージョンでは、ファイルへの入力のパイプインまたはファイルからのリダイレクトが可能で、追加を無効にする-aスイッチが含まれています(これはデフォルトで有効です)。

sudoe() {
  if ([[ "$1" == "-a" ]] || [[ "$1" == "--no-append" ]]); then
    shift &>/dev/null || local failed=1
  else
    local append="--append"
  fi

  while [[ $failed -ne 1 ]]; do
    if [[ -t 0 ]]; then
      text="$1"; shift &>/dev/null || break
    else
      text="$(cat <&0)"
    fi

    [[ -z "$1" ]] && break
    echo "$text" | Sudo tee $append "$1" >/dev/null; return $?
  done

  echo "Usage: $0 [-a|--no-append] [text] <file>"; return 1
}
4
hololeap

spongeパッケージからmoreutilsを使用することもでき、出力をリダイレクトする必要はありません(つまり、非表示にするためのteeノイズはありません)。

echo 'Add this line' | Sudo sponge -a privfile
2

どうですか:
エコーテキスト| sudo dd status = none of = privilegedfile
/proc/sys/net/ipv4/tcp_rmemを変更したい。
やった:
sudo dd status = none of =/proc/sys/net/ipv4/tcp_rmem <<< "4096 131072 1024000"
1行のドキュメントでエコーを除去します

0
Marcelo Pacheco

こんにちは世界をエコーし​​ます。 (Sudo tee -a /etc/apt/sources.list)

0
Sudev Shetty

sed -iwith$ aを使用すると、両方の変数と最後の行の後の特殊文字。

たとえば、$ NEW_IPとともに$ NEW_Hostを/ etc/hostsに追加する場合:

Sudo sed -i "\$ a $NEW_IP\t\t$NEW_Host.domain.local\t$NEW_Host" /etc/hosts

sedオプションの説明:

  • -iインプレース
  • $最終行
  • a追記用
0
Noam Manos