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 명령을 루트로 실행하는 방법은 다음과 같습니다.

마운트 지점을 마운트된 상태로 유지하기 위한 신호로 사용될 임시 파일을 생성하고 정리 후크에서 파일을 삭제합니다. sudo를 사용하여 루트로 실행되고 파일 삭제를 모니터링하고 삭제되면 제거하는 감시자 스크립트를 설정합니다.

#!/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 어느거기에 무엇이 설치되어 있는지에 관계없이 시간. 그러나 다른 목적이 없는 다른 마운트 지점으로 변경하면 쉽게 해결할 수 있습니다.

관련 정보