これらのコマンドは両方とも機能します:(-S
in Sudo
は、Sdinにstdinからパスワードを読み取るように指示します。
echo 'mypassword' | Sudo -S tee -a /etc/test.txt &> /dev/null
echo -e '\nsome\nmore\ntext' | Sudo tee -a /etc/test.txt &> /dev/null
ここで、2つを組み合わせたいと思います。つまり、すべてを1行で実現します。しかし、もちろん、次のようなものは機能しません。
echo -e '\nsome\nmore\ntext' | echo 'mypassword' | Sudo -S tee -a /etc/test.txt &> /dev/null
何がうまくいきますか?おかげで:)-Loady
PS:無関係な小さな質問:1>は>と同じですか?そうだと思う。
これは行います:
{ echo 'mypassword'; echo 'some text'; } | Sudo -k -S tee -a /etc/test.txt &>/dev/null
ポイントはSudo
とtee
が同じstdinを使用するため、両方が同じソースから読み取られます。 「mypassword」+「\ n」は、tee
に渡したいものの直前に置く必要があります。
{...}
を1つのコマンドとして見ることができます。 {...}
にあるものは何でもパイプに書き込みます。echo 'mypassword'
は「mypassword\n」をパイプに書き込みます。これは後でSudo
によって読み込まれます。echo 'some text'
"some text\n"をパイプに書き込みます。これが最後にtee
に到達するものです。Sudo -k -S
は、「\ n」に達するまで、パイプであるそのstdinからパスワードを読み取ります。 "mypassword\n"はここで消費されます。 -k
スイッチは、Sudo
がパスワードを要求することを確認し、最近使用された場合はユーザーのキャッシュされた資格情報を無視します。tee
はstdinから読み取り、「何かのテキスト\ n」など、残っているものをすべて取得します。PS:I/Oリダイレクトについて:はい、そうです。1>filename
は>filename
と同じです。どちらもstdoutをfilenameにリダイレクトします。また、0<filename
と<filename
は同一であり、どちらもstdinをリダイレクトします。
これは少し遅いですが、うまくいくことがわかりました。
Sudo -k && echo -e "password\ntext" | Sudo -S tee file > /dev/null 2>&1
これは複数のパイプを必要とせず、理解が簡単です。
> /dev/null 2>&1
これにより、パスワードを要求する出力を含むすべての出力が/ dev/nullにリダイレクトされます。
コメントには入れませんでしたが、-k
オプションと既存のSudo
コマンドを使用します。つまり、
Sudo -k && echo 'some text' | { echo 'mypassword'; cat -; } | Sudo -S tee -a /etc/test.txt &>/dev/null
-k
は元のSudo
にあります。それは「より安全」かもしれません:
echo 'some text' | { echo 'mypassword'; cat -; } | Sudo -k -S tee -a /etc/test.txt &>/dev/null