sudoに2つの標準入力を渡すには?

sudoに2つの標準入力を渡すには?

私の目標は、スーパーユーザー権限を必要とするファイルに何かを書くことであり、1行のコードでこれを実行したいと思います。私が試したステップ:

以下を使用してパスワードを渡すことができます。標準入力sudoそのオプションを使用して-S

printf 'password\n' | sudo -S cat /etc/test.txt

文字列を渡すこともできます。標準入力何かをするためにsudo

echo 'hello' | sudo tee /etc/test.txt

ただし、同じ行に文字列とパスワードを渡すことはできません。可能ですか?この目標をどのように達成できますか?

答え1

あなたが書いた

私の目標は、スーパーユーザー権限を必要とするファイルに何かを書き込むことです。

1つの方法は、グループの書き込み権限などを持つようにファイルに対する権限を軽減することです。次に、関連ユーザーをグループに追加します。ログアウト/ログインした後はsudo

別の「正しい」方法は、書き込みプロセスを管理するスクリプトを作成し、選択したユーザーがパスワードを提供する必要がないようにスクリプトにsudo権限を付与することです。/etc/sudoersこれの最大の利点は、ターゲットユーザーでもターゲットファイルに無料でアクセスできないことです。スクリプトは、入力をファイルに書き込む前に検証して整理できます。

ルートシェルを入手してください。これをオンにして、sudo動作が確実になるまで閉じないでください。

sudo -s

それではスクリプトを書いてみてください。

cat >/usr/local/bin/write-to-file <<'EOF'
#!/bin/bash
#
export PATH=/usr/local/bin:/usr/bin:/bin        # Only necessary for a non-standard PATH

# Restart with sudo if we are not already root
[[ $(id -u) != 0 ]] && exec sudo "$0" "$@"


# Read just one line into the target file
head -n1 >/etc/test.txt
EOF

このルートシェルを引き続き使用してスクリプトを実行可能にし、行を追加します。パスワードなしで実行できるユーザーアカウントまたは許可されている場合は、すべてのユーザーのsudoers初期値を変更します。userwrite-to-fileALL

chown root /usr/local/bin/write-to-file         # Ensure no-one else can modify the script
chmod a+rx,go-w /usr/local/bin/write-to-file    # Make it executable

echo 'user ALL = NOPASSWD: /usr/local/bin/write-to-file' >/etc/sudoers.d/write-to-file

まだルートシェルを閉じないでください。

ルート以外の端末で新しいスクリプトをテストします。あなたがwrite-to-file: command not foundあなた/usr/local/binの道にいない場合(実行export PATH="$PATH:/usr/local/bin"

echo hello | write-to-file                      # Should not prompt for password
cat /etc/test.txt                               # Should contain "hello"

write-to-file < /etc/passwd                     # Multiline input
cat /etc/test.txt                               # Contains only the first line from passwd

sudoを使用する必要もないことに注意してください。何が起こるかはスクリプトがルートとして実行されておらずsudo

答え2

サブシェルを使用してください:

(echo "password"; cat /some/file ) | sudo -S tee /etc/test.txt

ここでcat /some/file出力を生成する任意のコマンドになります。

答え3

これは、補助ファイルを使用してターゲットファイルを作成するという@roaimaのアイデアに従います。

  1. rootとしてログインし、write-to-file次のコードで呼び出される単純なスクリプトを作成します。

    echo $1 > /etc/test.txt
    

(/usr/local/binになければなりません。実行権限)。

  1. 一般ユーザーは、次の方法でどこからでも実行できます。

    echo 'password' | sudo -S write-to-file "hello!"
    

このようにして、ある文字列は標準入力として渡され、他の文字列は引数として渡されます。

メモ:このソリューションがセキュリティホールにつながるかどうかはわかりません。私の考えでは、いつものように安全でなければならないと思いますsudo

関連情報