これは、Linux での sudo パーミッションに関する非常に単純な質問です。少なくともそうあるべきだと思われます。
/etc/hosts
何かをまたは同様のファイルに追加したいだけなのに、root であっても と の両方が許可されていない>
ため、できなくなってしまうことがよくあります。>>
ルート化するsu
必要なく、これを機能させる方法はありますか?sudo su
これは、Linux での sudo パーミッションに関する非常に単純な質問です。少なくともそうあるべきだと思われます。
/etc/hosts
何かをまたは同様のファイルに追加したいだけなのに、root であっても と の両方が許可されていない>
ため、できなくなってしまうことがよくあります。>>
ルート化するsu
必要なく、これを機能させる方法はありますか?sudo su
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
のよう>>
に動作し、ファイルの最後に書き込みます。
問題は、シェルがsudoやechoではなく出力リダイレクトを行うため、これは通常のユーザーとして行われていることです。
次のコードスニペットを試してください。
sudo sh -c "echo 'something' >> /etc/privilegedfile"
問題は、リダイレクトを処理するのはシェルであるということです。sudoで実行しているプロセスの権限ではなく、自分の権限でファイルを開こうとしています。
おそらく、次のようなものを使用してください。
sudo sh -c "echo 'something' >> /etc/privilegedFile"
sudo sh -c "echo 127.0.0.1 localhost >> /etc/hosts"
やってる
sudo sh -c "echo >> somefile"
動作するはずです。問題は、>と>>が「sudoed」コマンドではなくシェルによって処理されるため、アクセス許可は「sudoed」するユーザーのアクセス許可ではなく、ユーザーのアクセス許可であるということです。
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
}
sponge
パッケージから使用することもできmoreutils
、出力をリダイレクトする必要はありません (つまり、tee
ノイズを隠す必要はありません)。
echo 'Add this line' | sudo sponge -a privfile