bash에서“true”의 목적은 무엇입니까? 그때"


20

이 bash 스크립트를 해킹하여 사용자에게 수퍼 유저 권한이 있는지 여부와 권한이 없는지 테스트합니다. 궁극적으로 다음 두 줄을 제거 할 수 있도록 두 번째 'if'문을 뒤집으려고합니다 (에코 "password ok"및 다음 줄의 else)

# Root user only
if [[ "$EUID" != 0 ]]; then
    sudo -k # make sure to ask for password on next sudo
    if sudo true; then
        echo "Password ok"
    else
        echo "Aborting script"
        exit 1
    fi
fi

echo "do my ops"

네 번째 줄에서 "true"의 목적은 단지 서술문입니까?

네 번째 줄에서 테스트를 뒤집어 야하는데 어떻게해야합니까? 내가 시도한 것은 다음과 같습니다.

if sudo false; then  
if sudo true == false; then
if [!(sudo true)]; then

2
질문에 대한 답을 줄이려면 질문을 개선하기 위해 어떻게해야하는지 설명해 주시겠습니까? 이것이 오버 플로우 사이트가 아닌가?
매트 파 킨스

4
다운 보트가 어디에서 오는지 확실하지 않습니다. 당신이하려고하는 부정 문을 또는 무효로 문을? 당신은 true / echo와 "else"를 제거하고 싶다고 말하는데, 최종 목표는 무엇입니까?
Jeff Schaller


1
@ ctrl-alt-delor 그 링크를 따라 가면 sudo 앞에 느낌표를 붙이는 것만으로 에코와 다른 것을 모두 제거 할 수 있으며 이제 테스트 해 보았습니다. 감사합니다.
매트 파 킨스

2
전달할 때 오류 메시지를 오류 스트림으로 리디렉션해야합니다.echo "Aborting script" >&2
Toby Speight

답변:


38

truebash는 키워드가 아니며 성공적인 종료 코드로 즉시 종료되는 프로그램입니다. 마찬가지로, false종료 코드가 실패하여 종료되는 프로그램입니다.

터미널에서 두 프로그램을 모두 실행 한 다음 $?마지막 프로그램의 종료 코드가 포함 된 변수 를 읽어서이를 시도 할 수 있습니다 .

true
echo $? # 0
false
echo $? #1

if sudo true에 해당하지 않습니다 if sudo == true. if sudo truetrue사용 하여 프로그램을 실행하고 sudo종료 코드를 확인하십시오.

따라서:

if sudo false; then프로그램 false을 sudo로 실행 중 입니다. 반품은 항상 거짓입니다.

if sudo true == falsetrue인수 ==false사용 하고를 사용하여 프로그램 을 실행합니다 sudo. 이것은 분명히 당신이 의도하고 싶지 않습니다.

if [!(sudo true)] 잘못된 구문입니다.

아마 당신이 찾고있는 것은

if ! sudo true;

12
약간 현학적 첫 문장을 수정 같이 떠들썩한 파티에서 , true그리고 false"내장 매크로는"명령은 쉘에 의해 직접 해석이다; 유닉스 계열 시스템에서는 일반적으로 파일 시스템에 독립형 프로그램으로 존재합니다. 차이점은 여기서 중요하지 않지만 내가 아는 sudo true한 bash 내장이 아닌 독립 실행 형 프로그램을 실행합니다.
IMSoP

31
PS : 내 마음에 드는 요약 true하고 false자신의 매뉴얼 페이지의 제목은 다음과 같습니다 true - do nothing, successfullyfalse - do nothing, unsuccessfully
IMSoP

3
@IMSoP 깊이 있습니다.
brainplot

2
경우 true존재하지 않는, 질문 쇼의 코드는 왜 하나를 발명해야 할 수도 있습니다! 그것은 켜져있는 시스템이 진정으로 붕괴 된 경우에만 실패 할 수있는 최소한의 프로그램입니다. 따라서 액세스 자격 증명이 올바른지 확인하는 데 사용할 수 있습니다.
nigel222

2
AT & T SYSV Unix에서 "true"는 쉘 스크립트 / bin / true로, 주석에는 많은 저작권 표시가 포함되어 있습니다.
리 다니엘 크로커

21

수락 된 답변이 실제로 귀하의 질문에 답변하지 않은 것 같습니까?

이 작업 의 목적 은 실제로 할 수 있는지 확인하는 것 sudo입니다.

이 확인이 수행되는 방법true 은 승인 된 답변에 설명 된대로 프로그램을 통하는 것입니다.


1
본질적으로 이것은. 대안은 사용자가 sudoers 그룹에 있는지 확인하는 것이지만 약간은 해 키지 만 실행 sudo true은 충분히 쉽습니다.
Sergiy Kolodyazhnyy

3
이것은 또한 sudo설치 가 필요 하므로 검사가 완전히 동일하지는 않습니다. sudoers 그룹에 속하더라도 여전히 sudo를 수행 할 수 없습니다. (예를 들어 sudo가 없을 수도있는 최소한의 rootfs tarball에서 새 이미지를 설정하는 스크립트를 작성하는 경우 특히 그렇습니다.)
Mehrdad

1
sudo를 할 수 없으면 OP는 제거하고 noop을 따르는 else 대신 두 줄을 제거하려고합니다.
mckenzm

2
반대로, sudo(개인적으로 또는 다른 그룹 의 구성원으로 )에 나열된 경우 sudoers 그룹에 속하지 않아도 될 수도 있습니다 /etc/sudoers. 그러나 심지어 sudo true로, 전혀 틀림이없는 sudo액세스를 특정 명령을 부여 할 수 있습니다 당신이 할 수있을 수 있도록 sudo true,하지만에 sudo something_else, 또는 그 반대의 경우도 마찬가지입니다. 실제로 실행하려는 명령을 실행하는 것 외에는 테스트 할 수있는 확실한 방법이 없습니다 sudo.
Dave Sherohman

2
또한 sudoers그룹에있을 수 sudo있으며 sudoers그룹이 sudoers파일에 나열되지 않아서 그룹에 속할 수 없습니다 . sudo이름이 네 글자 인 그룹은 해당 그룹의 사용자가 특정 작업을 수행 할 수 있는지 여부를 나타내는 유효한 표시가 아닙니다 sudo.
jrw32982는

5

이 스크립트에서 볼 수 있듯이. sudo가 활성화되어 있는지 확인하는 것입니다.

true는 true를 반환합니다.

따라서이 경우 sudo로 명령을 실행 해야하는 경우 처음 시작할 때 확인하여 암호를 한 번만 묻습니다.

조건은 다음과 같이 작동합니다. sudo가 true 명령을 올바르게 실행하는 경우 if 조건에 대해 true를 리턴 한 다음 sudo가 활성화되고 사용자가 비밀번호를 올바르게 입력했습니다. 그렇지 않으면 비밀번호를 잘못 입력했거나 sudo가 활성화되지 않은 경우 스크립트 계속해서는 안됩니다.

인증이 성공적으로 시작되었으므로 다른 명령은 sudo 비밀번호를 요구할 필요가 없습니다 (그러나 이는 sudo 구성에 따라 다르므로이 스크립트는 환경 구성에 크게 의존합니다)

'echo password ok'도 마찬가지입니다. 쉘 스크립트는 더 이상 암호를 묻지 않습니다.


1
sudo를 통해 실행되는 유일한 명령은 sudo truesudo -k입니다. 후자는 명시 적으로 암호를 요구하지 않습니다. 스크립트의 다른 명령은 sudo를 통해 실행되지 않으므로 인증이 처음으로 성공했는지 여부에 관계없이 암호가 필요하지 않습니다.
ilkkachu

"이 경우 sudo로 명령을 실행해야하는 경우 처음 시작할 때 확인하고 암호를 한 번만 묻습니다."
Luciano Andress Martini
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.