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 mount
umount
sleep
mount
また、一般ユーザーが、またはオプションでマウントできることが/mnt
わかります。詳細については、mount(8)とマニュアルページを参照してください。/etc/fstab
user
group
users
owner
fstab(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
どのそこに何がインストールされているかに関係なく時間。ただし、他の目的のない別のマウントポイントに変更すると、簡単に解決できます。