web-dev-qa-db-ja.com

パイプパスワードを「Sudo」に、その他のデータを「Sudo」コマンドに

これらのコマンドは両方とも機能します:(-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>は>と同じですか?そうだと思う。

4
Anthony Webber

これは行います:

{ echo 'mypassword'; echo 'some text'; } | Sudo -k -S tee -a /etc/test.txt &>/dev/null

ポイントはSudoteeが同じ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をリダイレクトします。

3
Navid Ht

これは少し遅いですが、うまくいくことがわかりました。

Sudo -k && echo -e "password\ntext" | Sudo -S tee file > /dev/null 2>&1

これは複数のパイプを必要とせず、理解が簡単です。

> /dev/null 2>&1

これにより、パスワードを要求する出力を含むすべての出力が/ dev/nullにリダイレクトされます。

1
Devansh Sharma

コメントには入れませんでしたが、-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
0
neze