私の目標は、スーパーユーザー権限を必要とするファイルに何かを書くことであり、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
初期値を変更します。user
write-to-file
ALL
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のアイデアに従います。
rootとしてログインし、
write-to-file
次のコードで呼び出される単純なスクリプトを作成します。echo $1 > /etc/test.txt
(/usr/local/binになければなりません。根実行権限)。
一般ユーザーは、次の方法でどこからでも実行できます。
echo 'password' | sudo -S write-to-file "hello!"
このようにして、ある文字列は標準入力として渡され、他の文字列は引数として渡されます。
メモ:このソリューションがセキュリティホールにつながるかどうかはわかりません。私の考えでは、いつものように安全でなければならないと思いますsudo
。