回答:
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
のように機能し>>
、ファイルの最後に書き込みます。
echo 'tmpfs /tmp tmpfs defaults 0 0' | sudo tee /etc/fstab
が何をするか想像してみてください
tee -a
代わりになりtee --append
ます。
-a
(--append
)フラグコマンドはファイル全体上書きしてしまい最後にそれを追加するのではなく、与えられた文字列とを。
問題は、シェルがsudoやechoではなく出力リダイレクトを行うことです。そのため、これは通常のユーザーとして行われています。
次のコードスニペットを試してください。
sudo sh -c "echo 'something' >> /etc/privilegedfile"
sh
、echoは\t
単一引用符内のようなエスケープシーケンスを解釈できます。printf %s 'something'
代わりに使用できます。
sudo /bin/bash -c "echo 'fs.inotify.max_user_watches = 524288' > /etc/sysctl.d/60-golang-inotify.conf"
。たとえば。
問題は、リダイレクトを処理するのがシェルであることです。sudoで実行しているプロセスのアクセス許可ではなく、ユーザーのアクセス許可でファイルを開こうとしています。
このようなものを使用してください:
sudo sh -c "echo 'something' >> /etc/privilegedFile"
sudo
(セキュリティ上の理由から)環境がサブプロセスに伝播されないためです。sudo -E
この制限を回避するために使用できます。
sudo sh -c "echo 'something' >> $FILENAME"
、二重引用符で、これがします仕事-変数置換は、外殻、ないsudoedシェルによって行われます。
sudo sh -c "echo 127.0.0.1 localhost >> /etc/hosts"
好奇心旺盛な方のために、ヒアドキュメントを引用することもできます(大きなブロックの場合)。
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"
"
行わないと内部が
ユの答えを使って、これをあなたの中に入れてください~/.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
方法:
エコーテキスト| 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行のドキュメントでエコーを排除します
これは私のために働きました:オリジナルのコマンド
echo "export CATALINA_HOME="/opt/tomcat9"" >> /etc/environment
作業コマンド
echo "export CATALINA_HOME="/opt/tomcat9"" |sudo tee /etc/environment
tee -a
。ただ、tee
ファイルが上書きされます!
ファイルの所有権を変更してからcat >>
、追加に使用した後で元に戻すことはできますか?
sudo chown youruser /etc/hosts
sudo cat /downloaded/hostsadditions >> /etc/hosts
sudo chown root /etc/hosts
このような何かがあなたのために働きますか?