web-dev-qa-db-ja.com

suスクリプトにパスワードを渡す

次のコマンドを実行するスクリプトを作成しようとしています。

Sudo su
runmqsc_result=`su -c "runmqsc QMGR < /home/rob/query_queue.txt" -m "mqm"`

ただし、私の問題は、これらのコマンドがsudoersファイルにあるユーザーによってシェルスクリプトの一部として実行されることです。ただし、明らかにSudosuはそれを実行しているユーザーのパスワードを要求します。

スクリプトが自動的に実行されるように、パスワードをSudosuに渡す必要があります。これどうやってするの?

p.s:「runmqsc」を実行するための権限を変更できません... rootユーザーから切り替える必要があるユーザーmqmとして実行する必要があります。

7
RobM

man Sudoから:

-S    The -S (stdin) option causes Sudo to read the password from the standard
      input instead of the terminal device.  The password must be followed by a
      newline character.

したがって、すべてのセキュリティ原則に反しますですが、echo 'password' | Sudo -S su [...]は機能するはずです。


または、スクリプトをrootのみで書き込み可能にし、以下を/etc/sudoersに追加して、ユーザーjohndoeがパスワードを入力せずにroot権限でスクリプトを実行できるようにすることもできます。

johndoe ALL = NOPASSWD: /full/path/to/your/script

rootのみが書き込み可能の部分は、johndoeがスクリプトを変更したり、rootとして任意のコマンドを実行したりするのを防ぐために重要です。

14
n.st

このソリューションは、pty(ターミナル)をセットアップする「bsdutiles」パッケージの「script」コマンドを使用して機能します。 「sleep」コマンドは、「su」コマンドがパスワードを読み取る準備ができる前にパスワードが送信されないようにするためにあります。 「tail」コマンドは、「su」によって発行された「Password:」入力行を削除します。

 { sleep 1; echo rootpassword } | script -qc 'su -c "runmqsc QMGR < /home/rob/query_queue.txt" -m "mqm"' /dev/null | tail -n +2

Rootpasswordはさまざまな方法(履歴、ps、/ proc /など)で表示される可能性があることに注意してください。少なくとも履歴の記録を避けるために、スペースを入れてコマンドを開始してください。

0
jcamdr