次のようにログインしていない他のユーザーとしてスクリプトを実行したいと思います。
/srv/system/check_alerts.sh <NAME>
大文字のみを含むパラメータが1つあります。可変長。 Visudoは古く、extglobを許可していないため、可変長パラメータを受け入れることはできません。
私はこれをsudoersに追加しようとしました。
alerter ALL=(gmail) NOPASSWD: /srv/system/check_alerts.sh [a-z][a-z][a-z][a-z][a-z]
alerter ALL=(gmail) NOPASSWD: /srv/system/check_alerts.sh [a-z][a-z][a-z][a-z]
alerter ALL=(gmail) NOPASSWD: /srv/system/check_alerts.sh [a-z][a-z][a-z]
alerter ALL=(gmail) NOPASSWD: /srv/system/check_alerts.sh [a-z][a-z]
alerter ALL=(gmail) NOPASSWD: /srv/system/check_alerts.sh [upper][upper][upper][upper][upper]
alerter ALL=(gmail) NOPASSWD: /srv/system/check_alerts.sh [upper][upper][upper][upper]
alerter ALL=(gmail) NOPASSWD: /srv/system/check_alerts.sh [upper][upper][upper]
alerter ALL=(gmail) NOPASSWD: /srv/system/check_alerts.sh [upper][upper]
その後、テストを実行します。
sudo -u alerter bash
そして:
bash-4.2$ sudo -u gmail /srv/system/check_alerts.sh TEST
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:
#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.
[sudo] password for alerter:
それでも、面倒なパスワードの入力を求められます。なぜ?
任意のパラメータに共通の「*」ワイルドカードを使用したくありません。 「&」などを使用するサブシェルを許可するため、これはオプションではありません。
それでは、可変長引数を許可し、安全でない「*」を防ぐにはどうすればよいですか?少なくともパスワードプロンプトに邪魔されずに作業する方法はありますか?
編集:今、これを追加しました。
alerter ALL=(gmail) NOPASSWD: /srv/system/check_alerts.sh *
visudoにはまだパスワードを要求し、NOPASSWDオプションを尊重しません。
デバッグ:以下を実行します:visudo -f /etc/sudoers.d/alerter
そして、次の行を追加しました。
alerter ALL=(gmail) NOPASSWD: ALL
次に、"alerter" bash シェルで次を実行します。
bash-4.2$ sudo -u gmail /srv/system/check_alerts.sh TEST
gmail is not in the sudoers file. This incident will be reported.
"sudo -l"の出力:
User alerter may run the following commands on test-host:
(ALL) NOPASSWD: /usr/bin/mailq
(gmail) NOPASSWD: ALL
修正する:
これが重要かどうかはわかりませんが、ユーザー「alerter」と「gmail」の両方が「mycompany」グループに属しています。
アップデート2:
提案されているように、 "check_alerts.sh"スクリプトから "sudo"を削除しました。次の場合、コマンドは正しく機能します。
alerter ALL=(gmail) NOPASSWD: /srv/system/check_alerts.sh *
- パスワードプロンプトなしで動作します。
これで/etc/sudoers.d/alerterに設定されました。
alerter ALL=(gmail) NOPASSWD: /srv/system/check_alerts.sh [[\:upper\:]][[\:upper\:]][[\:upper\:]][[\:upper\:]][[\:upper\:]]
これは素晴らしい作品です。アンケート調査に参加してくださった皆さんに感謝します!