[小ネタ] 自分のアカウントでsudoがNOPASSWDで使えるかを非対話式に確認する


Linux UNIXの自分のアカウントでsudoが使えるかどうかは、

このように、 /etc/sudoers の Defaults timestamp_timeout の値(分)を超えるまで待つか、何かしらのコマンドを実行して返り値を求めればよいです。が、自動実行しているスクリプトでこれをやろうとすると、

  • bashの内部コマンドなどで返り値がうまく取れない
  • sudoのパスワード待ち(対話コマンド)で待たされる

という問題を解決したくなるのが人情ってなもの。プログラムの中で自身のアカウントがNOPASSWDでsudoできるかどうかのチェックロジックを入れたいときに、このようなちょい面倒なハードルを超えなければならないのです。大きく面倒というわけじゃないですけど。

/etc/sudoers を短く編集するという手もあるじゃないかという声も聞こえてきますけど、それだと手オペでsudoするときの利便性が損なわれてしまいかねないので、システム全体の利便性を損ねずにプログラムの中だけで解決したいですよね?

bashの内部コマンドなどで返り値がうまく取れない を解決する

「何もしない」をしよう!ということで sudo 越しに「:」を実行するも...

まあ、そりゃそうですよねぇ、という結論。なので、sudo越しに正常終了を静かに返したいなら

こうするのが無難。

sudoのパスワード待ち(対話コマンド)で待たされる を解決する

自動実行スクリプトでsudoを使う場合、大抵 NOPASSWD を指定しているはず。なので、 /etc/sudoers か /etc/sudoers.d/${USER} がなければパスワードを聞いてくるので、パスワードなしでsudoを実行できることをもって正常終了としたい。しかし、何分も待ってられない。そこでtimeoutコマンドですよ!

NOPASSWDでsudoの権限を与えられていれば、このように正常終了。

しかし、NOPASSWDでsudoの権限を与えられていなければ、終了ステータス124で異常終了します。

timeoutコマンドで秒単位のタイムアウトを設けることで、プログラム内で無駄な待ち時間を持たせることなく、自身のアカウントがNOPASSWDでsudoできるかどうかを瞬時に判断できます。ね、簡単でしょう?