sudo 프롬프트를 기다릴 때 에코

sudo 프롬프트를 기다릴 때 에코

문맥

나는 사용하고있다이 방법루트로 실행하지 않는 경우 스크립트에서 권한을 높이십시오.

내 Bash 스크립트는 사용해야 하는 특정 파일이 존재하는지 확인합니다.

if [ $EUID != 0 ]; then
    if [ -f "/foo/bar" ]
    then
        AGE=$(expr `date +%s` - `stat -c %Y "/foo/bar"`)
        echo "/foo/bar is here, ${AGE}s old"
    else
        echo "/foo/bar not there (yet?)"
    fi

    sudo "$0" "$@"
    exit $?
fi

# the rest of the script, needs /foo/bar

따라서 루트가 아닌 사용자가 이 명령을 실행하고 파일이 존재하는 경우 응답은 다음과 같습니다 /foo/bar is here, 27s old. 그렇지 않으면 응답은 입니다 /foo/bar is not there (yet?). 그런 다음 sudo실행하라는 메시지를 표시합니다.

이제 질문은: 두 번째 경우, 아직 준비되지 않은 경우 , 나타나는 즉시 사용자에게 알릴 /foo/bar수 있는 방법이 있습니까 ? /foo/bar사용자가 비밀번호를 입력하면 "아, 파일이 있습니다." 또는 "기다린 후 Enter를 다시 누르는 것이 좋습니다."라는 메시지가 표시됩니다.

여기에는 두 부분이 있습니다.파일 시스템에 파일이 이미 존재하는지 감지(이건 묻지 마세요) 그리고sudo 프롬프트가 나타나면 무언가를 울립니다..

질문

나는 두 번째 부분에 관심이 있습니다. sudo 프롬프트 위 또는 아래에 "비동기적으로" 출력에 무언가를 쓸 수 있습니까?

답변1

질문의 두 번째 부분인 프롬프트를 기다리는 동안 메시지를 작성하는 방법에 대답하려면 다음을 수행하십시오 sudo.

trap '2>/dev/null' CHLD
(sleep 5; echo; echo "New spam has just arrived!") &
MSGPID=$!
sudo -v
wait $MSGPID
trap - CHLD

sleep 5서브셸에 비동기적으로 도착하는 메시지를 시뮬레이션합니다. 첫 번째는 echo메시지가 Password:프롬프트 옆에 나타나지 않는지 확인하는 것입니다. stderr글쓰기 대신 글쓰기를 할 때도 작동합니다 stdout.

첫 번째 trap는 백그라운드 작업 상태에 대한 메시지를 제거하는 것입니다. waitpid두 번째는 trap첫 번째의 효과를 취소합니다 trap.

의미 있는 PID를 반환하기 전에 하위 쉘의 명령이 종료되면 나쁜 일이 발생할 수 있습니다(일부 운영 체제에서는 발생할 수 있지만 지금은 그다지 많지 않기를 바랍니다).

관련 정보