bash EXITトラップにsudoパスワードプロンプトが表示されるのを防ぐ方法は?

bash EXITトラップにsudoパスワードプロンプトが表示されるのを防ぐ方法は?

bashシェルスクリプトがトラップを使用してこれらのクリーンアップを実行するとします。

#!/bin/bash

cleanup() {
  sudo umount /mnt
}
trap cleanup EXIT
sudo mount /mnt
#do long running stuff like sleep 3600

上記のスクリプト(常に指定した設定によって異なります/etc/sudoers)は、ユーザーのパスワードだけでなくクリーンアップmountにも使用されますumount。 「sudo権限がロードされました」などのトラップを設定する方法はありますか?つまり、ユーザーパスワードを再入力する必要はありません。

理想的には、sudoを介してスクリプト全体を実行してこれを実行しないでください。exec sudo "$0" "$@"または同様です。可能な場合にのみ特権で実行されるようにトラップを設定する方法が必要です。

答え1

trap以下を使用する代わりに:

#! /bin/sh -

sudo mount /mnt || exit
{
  (
    sleep 3600
  ) 3>&1 >&4 4>&- | sudo sh -c 'cat>/dev/null; umount /mnt'
} 4>&1

メソッドは、パイプが閉じられたとき、つまりパイプ内のサブシェルが終了したときにすぐにsudo sh...開始されます。sudo mountumountsleep

mountまた、一般ユーザーが、またはオプションでマウントできることが/mntわかります。詳細については、mount(8)とマニュアルページを参照してください。/etc/fstabusergroupusersownerfstab(4)

答え2

コマンドが完了する前に資格情報がタイムアウトした場合でも、同じsudo資格情報を使用してumountコマンドをrootとして実行する方法は次のとおりです。

マウントポイントをマウントされたままにするための信号として使用される一時ファイルを作成し、クリーンアップフックからファイルを削除します。 sudoを使用してrootとして実行され、ファイルの削除を監視し、削除されたときに削除するウォッチャースクリプトを設定します。

#!/bin/bash

keepmounted=$(mktemp -t keepmounted.$$.XXXXXX)

cleanup() {
    rm -f "$keepmounted"
}
trap cleanup EXIT

touch "$keepmounted"

sudo mount /mnt
sudo sh -c "while test -e $keepmounted; do sleep 0.5; done; umount /mnt" &

echo "Doing long running task..."
sleep 3
sudo -k  # Reset cached credentials to simulate long enough time
echo "done."

答え3

たとえば、NOPASSWD修飾子を使用できます。sudoers

humanityANDpeace ALL = NOPASSWD:/bin/umount /mnt

もちろんこれを行うと削除できます。/mnt どのそこに何がインストールされているかに関係なく時間。ただし、他の目的のない別のマウントポイントに変更すると、簡単に解決できます。

関連情報