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


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

[oreore@marina ~]$ sudo :

あなたはシステム管理者から通常の講習を受けたはずです。
これは通常、以下の3点に要約されます:

    #1) 他人のプライバシーを尊重すること。
    #2) タイプする前に考えること。
    #3) 大いなる力には大いなる責任が伴うこと。

[sudo] oreore のパスワード:

[oreore@marina ~]$ echo $?
124

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

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

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

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

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

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

[nullpopopo@marina ~]$ sudo : ; echo $?
sudo: :: コマンドが見つかりません
1
[nullpopopo@marina ~]$ which :
/usr/bin/which: no : in (/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/nullpopopo/.local/bin:/home/nullpopopo/bin)

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

[nullpopopo@marina ~]$ sudo echo "" > /dev/null 2>&1 ; echo $?
0

こうするのが無難。

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

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

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

[nullpopopo@marina ~]$ timeout 1 sudo echo "" > /dev/null 2>&1 ; echo $?
0

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

[oreore@marina ~]$ timeout 1 sudo echo "" > /dev/null 2>&1 ; echo $?
[sudo] oreore のパスワード:
124

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