私は定期的にSSH経由でboxenにログインし、Sudo
を使用してrootとしてupdateなどを実行します。
端末などから離れる場合、Sudo
が一定時間後にパスワードを要求することを感謝します。ただし、ログインパスワードまたはSSHキーフレーズを既に入力しているため、preferSudo
notログイン後の最初のn分間はパスワードを要求しますが、ログイン直後にSudoが正常に実行されたかのように動作します。
これは、ログイン後の最初の呼び出しにパスワードが不要になるように構成できますか?
目的の動作の例を作成するには
ssh [email protected]
[~]$ Sudo somecommand
[~]$ #no password asked.
[~]$ Sudo somecommand #n minutes later
[Sudo] password for foo:
これがどのように行われるかについてのアイデアです。 注:これはハックです。単語passwordless Sudoが眉を頭蓋骨までずっとcraわせたい場合にのみ使用してください。
前提は、ログイン資格情報をSudo
に渡すことはできません。したがって、問題は、ログインの最初の数分間だけNOPASSWD
Sudoを使用する方法です。これを行うには、NOPASSWD
モードでログインシェルを起動し、.bashrc
でバックグラウンドプロセスを生成し、数分後にNOPASSWD
を取り消します。
# somewhere near the bottom of ~/.bashrc
Sudo -n /bin/bash -c "$HOME/nopasswd-Sudo 60s 12h <&- >&- &"
もちろん、スクリプト自体はwithNOPASSWD
Sudoで起動する必要があります。そうしないと、パスワードの入力を求められます。 Andbashセッションが終了すると、スクリプトはNOPASSWD
ルールを復元し、次のログインにNOPASSWD
が設定されるようにする必要があります。
これを行うスクリプト$HOME/nopasswd-Sudo
は次のとおりです。
#!/bin/bash
Sudo_FILE="/etc/sudoers.d/$(basename "$0")-${Sudo_USER}"
Sudo_RULE="${Sudo_USER} ALL=(ALL:ALL) NOPASSWD: ALL"
[ -z "$Sudo_USER" ] &&
echo "$(basename "$0"): must be invoked with Sudo" >&2 &&
exit 1
# Trap exit to recreate Sudo_FILE for next login
trap "echo '$Sudo_RULE' > '$Sudo_FILE'; exit 0" EXIT
# First time around just exit, creating the Sudo_FILE
[ -f "$Sudo_FILE" ] || exit 0
# After $1 (default 5m) remove Sudo_FILE to end NOPASSWD Sudo
sleep ${1:-5m} && rm -f "$Sudo_FILE"
# Wait until our parent exits, and we will exit via the trap
# If after $2 (default 12h) still alive, we assume we missed the HUP
sleep ${2:-12h}
最初の実行(.bashrc
からではなく、コマンドラインから実行する必要があります)で、スクリプトは/etc/sudoers.d/nopasswd-Sudo-$USER
のNOPASSWD
ワイルドカードを含む$USER
ファイルを作成します:
{username} ALL=(ALL:ALL) NOPASSWD: ALL
その後、ログインするたびに起動し、パスワードなしの時間が経過するまでバックグラウンドで待機します。その後、ファイルを削除し、次のSudo
にはパスワードが必要になります。
その後、無期限に(実際には、親のHUP信号を見逃した長引く孤児を防ぐために12時間まで)、またはその親であるログインシェルが終了するまで待機します。終了する直前に、EXITトラップはNOPASSWD
ファイルを再作成します。
冒険のためのヒント:ログインスクリプトやSudo
ルールをいじる間は、常に別のルートシェルを開いたままにしてください。あなたが自分をロックアウトする最初の人ではないでしょう。