どちらのコマンドも機能します。 (-S
inはsudo
sudoに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つを組み合わせたいです。つまり、すべてを一行で実装したいのです。しかし、もちろん、次のことはうまくいきません。
echo -e '\nsome\nmore\ntext' | echo 'mypassword' | sudo -S tee -a /etc/test.txt &> /dev/null
何が効果がありますか?ありがとう :) - ロード
PS:関係のない小さな質問:1>>と同じですか?私は彼らが...
答え1
これを行うことができます:
{ echo 'mypassword'; echo 'some text'; } | sudo -k -S tee -a /etc/test.txt &>/dev/null
要点は、同じ標準入力をsudo
使用するため、tee
両方とも同じソースから読み取られることです。に渡したい項目の前に「mypassword」+「\ n」と入力する必要がありますtee
。
コマンドを説明します。
- グループコマンドを中かっこで囲みます。私たちはそれを
{...}
命令と考えることができます。コンテンツが{...}
パイプに記録される方法は重要ではありません。 echo 'mypassword'
パイプに "mypassword\n" を書き込みます。sudo
後で読む内容です。echo 'some text'
パイプに「一部のテキスト\ n」を書き込みます。これがtee
最終的に達成されるものです。sudo -k -S
「\n」に達するまで、標準入力(つまりパイプ)からパスワードを読みます。したがって、「mypassword\n」はここで使用されます。このスイッチは、パスワードの入力を求められ、ユーザーが最近使用したキャッシュされた資格情報を無視できるように-k
するためのものです。sudo
tee
標準入力から読み込み、残りの部分である「一部のテキスト\ n」を取得します。
PS:I / Oリダイレクト情報:はい1>filename
、そうです>filename
。どちらもstdoutを 。ファイル名。そして両方とも同じで、両方とも標準入力をリダイレクトします0<filename
。<filename
答え2
少し遅れましたが、これはうまく機能することがわかりました。
sudo -k && echo -e "password\ntext" | sudo -S tee file > /dev/null 2>&1
複数のパイプが必要なく、わかりやすいです。
> /dev/null 2>&1
これにより、すべての出力(パスワードの入力を含む)が/ dev / nullにリダイレクトされます。
答え3
コメントに入れることはできませんが、この-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