배쉬-여러 사용자를위한 테스트


0

현재 사용자 중 두 명 중 하나가 사용자가 프로세스를 시작할 수 있는지 테스트하려고하지만 다중 조건이 올바르게 작동하지 않는 것 같습니다.

test ($(whoami) != 'mpurcell' || $(whoami) != 'root')) && (echo "Cannot start script as non-ccast user..."; exit 1)

다음과 같이 두 줄을 입력하지 않고도 여러 사용자를 테스트하는 방법이 있습니까?

test $(whoami) != 'mpurcell' && (echo "Cannot start script as non-ccast user..."; exit 1)
test $(whoami) != 'root' && (echo "Cannot start script as non-ccast user..."; exit 1)

답변:


4

bash 3.x 이상에는 =~[[연산자에서 사용 가능한 정규식 일치 연산자가 있습니다.

if [[ ! "$(whoami)" =~ ^(mpurcell|root)$ ]]
then
    echo "Go away" >&2
    exit 1
fi

기타...

정규 표현식에 대한 인용 규칙이 bash 3.2 정도에서 변경되었다는 것을 읽었습니다. 위의 내 3.2.25에서 작동하므로 bash가 더 오래된 경우 인용해야 할 수도 있습니다.


^(mpurcell|root)$예를 들어 jethrootis와 일치하지 않도록 사용해야 합니다. 또한, 당신은 다음과 같이 부정을 할 수 있습니다[[ ! "$(whoami)" =~ ^(mpurcell|root)$ ]]
Gordon Davisson

2

test는 단지 명령이므로 표현식은 다른 명령의 인수와 마찬가지로 구문 분석됩니다. 즉, 괄호, 파이프 등을 이스케이프하거나 인용해야 작동합니다 (이 문제를 피하려면 대신 대신 test사용하십시오 ). 실제로 bash를 사용하는 경우 이러한 구문 분석 확률을 피하는 테스트 표현식이 있습니다.-o||[[ ]]

또한 식 논리가 꺼져 있습니다. 현재 사용자가 mpurcell 이 아니 거나 root 가 아닌 경우 오류를보고합니다 . 현재 사용자가 둘 다 될 수 없으므로 항상 오류가 발생합니다. 나는 당신이 원하는 확신 하고 거기에있다.

마지막으로 echo ...; exit 1괄호 안에 파트가 있으므로 서브 쉘에서 실행되므로 exit명령이 스크립트가 아닌 서브 쉘을 종료합니다. 이를 피하려면 { ... }괄호 대신 사용하십시오 .

bash 버전은 다음과 같습니다.

[[ $(whoami) != 'mpurcell' && $(whoami) != 'root' ]] && { echo "Cannot start script as non-ccast user..."; exit 1; }

다음은 일반적인 POSIX 셸에서 작동해야하는 버전입니다.

test "$(whoami)" != 'mpurcell' -a "$(whoami)" \!= 'root' && { echo "Cannot start script as non-ccast user..."; exit 1; }

설명을 +1하기 위해 whoami한 번만 호출 하면 되기 때문에 Rich의 솔루션 만 사용하기로했습니다 .
Mike Purcell 2016 년

0

시도 : [$ (whoami)! = 'mpurcell'-a $ (whoami)! = 'root'] && (echo "ccast가 아닌 사용자로 스크립트를 시작할 수 없습니다 ..."; 종료 1)


답변 주셔서 감사합니다. 나는 Rich의 답변을 선택했습니다.
Mike Purcell 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.