Sudo-sudo가 있는지 여부 및 / 또는 시간이 얼마나 남았는지 확인하는 명령이 있습니까?


27

(원래 스택 오버플로에 게시되었습니다. 그들은 대신 여기에 시도해 보라고 제안했습니다. 원래 게시물은 다음과 같습니다. https://stackoverflow.com/questions/3858208/sudo-is-there-a-command-to-check-if-i-have 스도 및 얼마나 많은 시간이 남아 있습니다 )

제목을 참조하십시오. sudo를 쿼리 할 수있는 명령을 원합니다. 이상적으로 여전히 sudo가 있으면 성공을 반환하고 sudo가 만료되면 false를 반환합니다. 남은 시간을 얻는 것도 도움이 될 수 있습니다.

내가 찾은 가장 가까운 것은 "sudo -n true"이지만 -n 옵션은 직장 내 Centos 5 컴퓨터에만 있습니다. 암호를 요청해야하는 경우 -n이 실패합니다. 이 기능을 얻는 다른 방법이 있습니까? 내가 작업하는 모든 컴퓨터에 실제로 루트가 없다고 가정하면 원하는대로 새 버전의 sudo를 설치할 수 없습니다.

그만한 가치가 있기 때문에 sudo 상태를 나타내는 프롬프트를 얻을 수 있습니다. 어떤 터미널이 활발히 sudo 가능한지 알고 싶습니다. 또한 루트 일 때 색상을 변경하라는 프롬프트가 표시되지만 루트를 자주 사용하지 않으므로 제한적으로 사용됩니다.

답변:


10

-n옵션은 최신 버전의 sudo에서 사용할 수 있지만 언급했듯이 옵션이 아닙니다. sudo를 시도하고 암호를 묻는 메시지가 표시되는지 확인하는 것보다 짧은 것을 찾는 실제 방법은 없습니다. 우려 사항을 시각적으로 표시하려면 sudo / bin / bash를 시작하여 루트 bash 세션을 시작하십시오. 이것은 안전하지 않지만 누군가 sudo에서 프롬프트 변경 사항을 인식하면 다소 안전하지 않습니다.


1
시각적 표시기의 보안 영향으로 +1!
추후 공지가있을 때까지 일시 중지되었습니다.

그 부분은 나에게 일어나지 않았다. 표시기가 기대하는 것은 sudo를 활성 상태로두고 잠재적으로 위험한 일부 터미널을 열어 두는 대신 sudo -K를 실행하도록 상기시키는 것입니다. 화면을 잠그는 것을 잊는 것이 아니라 추가 보험이 마음에 듭니다.
valadil

현재 sudo -V를 확인하고 -n을 가질만큼 충분히 새로운 경우 알림을 받기 위해 -n을 확인합니다. 아무데도 깨지 말아야 할 것 같습니다.
valadil

@ valadil : 미묘한 지표가 너무 많은 보안 위험을 유발하지 않을 것입니다. 예를 들어 프롬프트에서 사용자 이름 밑줄을 켭니다.
추후 공지가있을 때까지 일시 중지되었습니다.

@ 데니스 : 맞습니다. 프롬프트를 "OMG_YOU_HAVE_SUDO_NOW! _user @ host"또는 이와 유사한 것으로 변경하지 않았습니다. 아마도 색상을 약간 변경했을 것입니다. 나는 그들이 앉아서 내 .bashrc에 친밀하지 않으면 그것이 무엇을 의미하는지 알기를 기대하지 않습니다.
valadil

29

나는 이것이 정말로 오래된 질문이라는 것을 알고 있지만 오늘 스크립트에서 내가 한 것입니다.

CAN_I_RUN_SUDO = $ (sudo -n 가동 시간 2> & 1 | grep "load"| wc -l)
[$ {CAN_I_RUN_SUDO} -gt 0] 인 경우
그때
    echo "sudo 명령을 실행할 수 있습니다"
그밖에
    echo "Sudo 명령을 실행할 수 없습니다"
fi

1

아래 명령은 sudo가 부여한 색상 표시를 나타내므로 sudo -k기기를 떠나기 전에 수행해야합니다 . 컬러가 아닌 터미널에서도 유용합니다.

다른 터미널 세션에서 sudo를 활성화 및 비활성화 할 수 있으므로 ~ / .bashrc 끝에 넣을 수 있도록 이것을 만들었습니다.

function FUNCpromptCommand () { 
    sudo -n uptime 2>/dev/null 1>/dev/null
  local bSudoOn=`if(($?==0));then echo true; else echo false; fi`

    history -a; # append to history at each command issued!!!
    local width=`tput cols`;
    local half=$((width/2))
    local dt="[EndAt:`date +"%Y/%m/%d-%H:%M:%S.%N"`]";
  if $bSudoOn; then dt="!!!SUDO!!!$dt"; fi
    local sizeDtHalf=$((${#dt}/2))
    #printf "%-${width}s" $dt |sed 's" "="g'; 
    echo
    output=`printf "%*s%*s" $((half+sizeDtHalf)) "$dt" $((half-sizeDtHalf)) "" |sed 's" "="g';`

    local colorLightRed="\e[1;31m"
  local colorNoColor="\e[0m"
    if $bSudoOn; then
        echo -e "${colorLightRed}${output}${colorNoColor}"
    else
        echo -e "${output}"
    fi
}
export PROMPT_COMMAND=FUNCpromptCommand

터미널 유형 bash에서 테스트하십시오. 또한 명령을 실행할 때마다 마지막 명령이 종료 된 시간에 대한 정보가 포함 된 전체 행을 추가하므로 점심 식사를하고 마지막 명령이 언제 종료되었는지 알 수 있습니다. :).

필요에 따라이 코드를 사용할 수 있습니다. PS1 변수도 있습니다 (실제 작은 프롬프트 한 줄).하지만 엉망이되지 않는 것이 좋습니다.

PS .: OS-X의 경우 아래 @nwinkler의 주석을 찾으십시오.


종료 코드를 확인하면 sudo -nOS X에서 작동하지 않는 것 같습니다. 여기 내 질문을 참조하십시오 : superuser.com/questions/902826/…
nwinkler

글쎄, 내가 제안하는 테스트는 sudo -n사용자가 sudo 액세스가 활성화되어 있는지 확인하는 데 사용할 수있는 다른 테스트가있을 수 있다고 생각합니까? 아니면 OS-X에 업데이트가 필요합니까? OS-X btw를 사용한 적이 없습니다.
물병 자리 힘

2
최신 버전의 OS X를 사용하고 있습니다 sudo -n. BSD (OS X 기반)는 GNU 버전과 동작이 다를 수 있습니다. 방금 사람들에게이 버전의 확인이 OS X에서 작동하지 않는 것임을 알리기 위해 내 의견을 추가했습니다. 다른 답변의 확인 ( sudo -n uptime 2>&1|grep "load"|wc -l)을 사용했으며 OS X에서 제대로 작동하는 것 같습니다. 그러나 작동합니다.
nwinkler

1
@nwinkler 아, 실제로 출력 (반환 값이 아님), 흥미로운 해결 방법에 따라 다릅니다.
Aquarius Power

@nwinkler 그러나 가능한 한 가깝습니다. 또는 더 나은 때문에이 sudo -n된다 -V 1.7.9는 sudo에 버그
마르코 M. 폰 하겐

1

@ wags007의 답변을 단순화하려면

if sudo -n true
then
  sudo id
else
  echo "sorry, but did not want to bother you"
fi

그러나 https://www.sudo.ws/man/1.8.15/sudoers.man.html 구성 defaults mail_badpass에서 모든 테스트에 대해 메일이 전송되어 거짓으로 표시됩니다 (프롬프트가 표시됨). 이러한 성가심을 피하려면 sudoers 파일의 해당 부분을

Defaults       mail_badpass
Defaults!      /bin/true !mail_badpass

결과적으로 / bin / true를 제외한 모든 명령에 대해 보안 경고 메일이 전송됩니다. 글쎄, 누군가는 이제 sudo true보안 경고 메일을 보내지 않고 무제한 으로 전화를 걸어 암호를 무차별로 만들 수 있습니다 .

참고 : visudosudoers 파일을 편집 할 때는 항상 선호하는 편집기 대신 사용 하십시오. 그렇게하지 않으면 잠길 위험이 있습니다.


0

sudo 매뉴얼에 따르면 sudo 세션은 타임 스탬프 파일 ( /usr/lib/sudo/<username>) 에 따라 결정되므로 타임 스탬프 파일 의 날짜 / 시간을 확인하여 남은 시간을 파악할 수 있습니다. 그러나 내 시스템에서 타임 스탬프 파일은 실제로 디렉토리이며 암호 내용이있는 세 개의 파일이 있습니다 (그리고 이상한 타임 스탬프도 있지만 /usr/lib/sudo/<username>암호를 sudo 한 시간과 일치하는 타임 스탬프가있는 것처럼 보입니다) /usr/lib/sudo/<username>/0가장 최근의 타임 스탬프가 있다고 생각 합니다 sudo.


1
내 시스템에서 타임 스탬프 파일은 sudo를 사용하지 않으면 읽을 수없는 디렉토리에 있으며, 비밀번호를 묻는 메시지가 표시되어 OP의 요구에 맞지 않습니다.
추후 공지가있을 때까지 일시 중지되었습니다.

좋은 지적. 이 파일의 소유권을 확인하지 않았습니다. 당신 말이 맞아요
Dysaster


0

sudo 1.8.21p2 이상에서는이 방법이 효과적입니다.

if sudo -vn 2> /dev/null; then
    echo "You have an active sudo session"
fi

0

이것은 아마도 대부분의 사람들의 표준에 의해 극단적으로 과잉 일 것입니다. 그러나 sudo잠금이 해제 되어 있는지 확인하는 데 사용하는 (아마도 올바른) 기능이 있습니다 (사용자 root가 잠금을 해제 할 필요가 없으므로 실행하는 경우 시간을 낭비하지 않습니다 sudo).

#!/bin/sh

_unlock_sudo() {
    if [ "$USER" != 'root' ]; then
        if ! sudo -n -- true 2>/dev/null; then
            printf '\n'
            printf 'Enter password for sudo user "%s":\n' "$USER"
            while ! sudo -- true; do
                printf '\n'
                while true; do
                    printf 'Slow your roll. Try to enter password again? [Y/n]: '
                    read -r answer
                    case "$answer" in
                        ''|y|Y|yes|Yes|YES)
                            printf '\n'
                            printf 'Enter password for sudo user "%s":\n' "$USER"
                            break
                            ;;
                        n|N|no|No|NO)
                            printf '\n'
                            printf 'OK. Exiting...\n'
                            exit 1
                            ;;
                        *)
                            printf 'Please enter a valid option...\n'
                            printf '\n'
                            ;;
                    esac
                done
            done
        fi
    fi
}

_unlock_sudo

-1

간단한 대답 ...

sudo echo
isSudo=$?
if [[ "$isSudo" -ne 0 ]]; then
  echo "This script must be run by root or a sudo'er"
  echo
  exit 1
fi

# do stuff

exit 0

사용자가 이미 활성 sudo는 세션이없는 경우에, 암호를 입력하라는 메시지가 표시됩니다
Slizzered

-2

매뉴얼 페이지는 어떻습니까

man sudo

사용 가능한 명령을 나열하십시오.

sudo -l

sudo 자체에는 시간 또는 날짜 제한이 없습니다 ... 참조 :

man sudo
man sudoers

sudo -l은 암호 프롬프트를 표시합니다. 활성 sudo 세션이 없다고 말해야합니다.
valadil

sudo 상태가 시간 초과되지만 스케줄 기능이없는 경우 올바른 것입니다.
추후 공지가있을 때까지 일시 중지되었습니다.

예-시간이 초과되었지만 일정이 없습니다.
Andreas Rehm
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.