656

これは、Linux での sudo パーミッションに関する非常に単純な質問です。少なくともそうあるべきだと思われます。

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

ルート化するsu必要なく、これを機能させる方法はありますか?sudo su

4

15 に答える 15

979

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

-a( / --append) フラグについて覚えておいてください。teeのように機能し、ファイルを上書き>します。tee -aのよう>>に動作し、ファイルの最後に書き込みます。

于 2009-02-15T12:34:20.173 に答える
338

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

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

sudo sh -c "echo 'something' >> /etc/privilegedfile"
于 2008-09-17T16:11:30.177 に答える
37

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

おそらく、次のようなものを使用してください。

sudo sh -c "echo 'something' >> /etc/privilegedFile"
于 2008-09-17T16:13:12.093 に答える
18
sudo sh -c "echo 127.0.0.1 localhost >> /etc/hosts"
于 2008-09-17T16:11:23.140 に答える
15

やってる

sudo sh -c "echo >> somefile"

動作するはずです。問題は、>と>>が「sudoed」コマンドではなくシェルによって処理されるため、アクセス許可は「sudoed」するユーザーのアクセス許可ではなく、ユーザーのアクセス許可であるということです。

于 2008-09-17T16:14:45.940 に答える
4

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
}
于 2014-09-24T17:50:33.143 に答える
2

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

echo 'Add this line' | sudo sponge -a privfile
于 2018-06-27T00:41:18.673 に答える