スーパーユーザーのアクセス許可が頻繁に必要なファイルに書き込みまたは追加できるように| Sudo tee FILENAME
を使用しています。
状況によってはなぜ役立つのかは理解できますが、tee
も入力をSTDOUTに送信するので、実際にtee
のその部分を実際に使用したことはありません。ほとんどの場合、追加の手順を実行せずに手動でtee 1> /dev/null
を使用して沈黙させないと、この機能によって画面に不要なジッタが発生するだけです。
私の質問:tee
とまったく同じことをするコマンドアラウンドがありますが、デフォルトでは何もSTDOUTに出力しませんか?
パイプを介して/dev/zero
に戻るのを避ける別のオプションは、
Sudo command | Sudo dd of=FILENAME
dd
ソリューションは、依然としてジャンクをstdoutに出力します。
$ ls | Sudo dd of=FILENAME
0+1 records in
0+1 records out
459 bytes (459 B) copied, 8.2492e-05 s, 5.6 MB/s
これは、status
オプションを使用して回避できます。
command | Sudo dd status=none of=FILENAME
別の興味深い可能性(とにかくLinuxの場合):
command | Sudo cp /dev/stdin FILENAME
TTY入力をファイルにコピーするために、私はよくこれを行います。
Sudo cp /dev/tty FILENAME
残念ですが、ティーにはstdoutを抑制するオプションがありません。
スクリプトを使用できます。つまりこのようなもの、つまり$HOME/bin/stee
、0tee
または類似:
#!/bin/bash argv= while [[ "$1" =~ ^- ]]; do argv+=" $1" shift done Sudo tee $argv "$1" > /dev/null
#!/bin/bash
Sudo tee "$@" > /dev/null
実行可能にする:
$ chmod 755 stee
次を実行してください:
$ ls -la | stee -a/root/foo
コマンド全体をSudoにラップできるので、シェル自体とリダイレクトはroot
として実行されます。
Sudo sh -c 'do_something > FILENAME'
ルート所有ディレクトリに対してファイルを作成しようとする
$ ls -la /opt/ | head -2
total 0
drwxr-xr-x 3 root wheel 96 Jun 13 2019 .
$ touch /opt/bufu
touch: /opt/bufu: Permission denied
厄介なリダイレクトを使用してファイルを作成し、イベントをログに記録し、ファイルコンテンツをstdoutに、ある程度並行して、確実に同時に書き込みます。
$ cat /tmp/test.sh
#!/bin/sh
file=/opt/bufu
message="an embarrassing failure"
rm -rf $file
{ echo $file \
| tee /dev/fd/2 \
| xargs Sudo sh -c 'echo $1 >$2' _ "$message"
} 2>&1 \
|
{ tee /dev/fd/3 \
| xargs logger -s "Create File"
} 3>&1 \
|
{ xargs cat \
| xargs -I% echo file content is "%"
}
$ /tmp/test.sh
rm: /opt/bufu: Permission denied
Feb 7 17:03:16 bufu[4039] <Notice>: Create File /opt/bufu
file content is an embarrassing failure
おい、それが不快な位置に強制されているのはティーのせいではない-xargs shを使用するか、独自のワンライナーを書く
cat <<eof >./aef
echo "$1" >$2
eof
..
Sudo aef "is a cool guy" /opt/fubar