bash 스크립트에서 sudo 무시


9

작은 bash 스크립트가 있습니다.

#!/bin/bash

touch dummy.txt

이 스크립트를 실행하면 루트로 보호 되는 스크립트 sudo가 생성 됩니다 .dummy.txt

내가하고 싶은 것은 :

이 스크립트가 sudo일반 사용자를 사용하여 실행되는지 여부에 관계없이 파일 dummy.txt은 루트로 보호 되어서는 안됩니다 .


4
"루트 보호"의 의미에 관계없이 chownchmod스크립트를 사용하여 원하는대로 소유권과 권한을 설정할 수 있습니다 .
fkraiem

1
"루트 보호"의 의미가 명확하지 않습니다. 루트 사용자 만 읽고 쓸 수 있거나 (예 : 파일 권한이 700과 같은 것으로 설정 됨) 루트 사용자가 파일 소유자임을 의미합니까?

1
@DoritoStyle 혼란을 드려 죄송합니다. 하여 루트 보호 , 나는 의미 루트 사용자가 파일의 소유자입니다.
Anonymous

답변:


22

and 변수 를 sudo사용하여 스크립트가 실행 중인지 테스트 한 다음 true 인 것처럼 실행할 수 있습니다.EUIDSUDO_USERtouchSUDO_USER

#!/bin/bash

if [[ $EUID -eq 0 ]] && [[ -n $SUDO_USER ]]; then
  sudo -u "$SUDO_USER" touch dummy.txt
else
  touch dummy.txt
fi

2
참고 ==문자열 비교에 사용됩니다. $EUID정수 값을 반환해야하기 때문에 -ed비교 를 사용하는 것이 좋습니다 . usernames에 공백이 허용 되므로 $SUDO_USER변수를 인용하십시오 . 그렇지 않으면 좋은 대답입니다. 이것은 개인적으로 사용하는 것입니다.
Sergiy Kolodyazhnyy

@steeldriver 이것은 내가 찾고 있었던 것입니다. 감사!!
익명

1
스크립트 sudo -u가 루트로 실행되고 있음을 감지하면 스크립트를 다시 실행할 수 있습니다 . OP는 하나의 스크립트에 여러 명령을 갖는 것에 대해 이야기했습니다. 그러나 무한 반복 오류가 발생하지 않도록주의하십시오.
Peter Cordes

1
어떤 단어 분리는 내 없습니다 [[...]]문 @Serg 내가 gues이 경우 내에서 변수를 인용 그래서 꼭 필요한 것은 -ed오타에 대한이었다-eq
Arronical

@Arronical 예, 오타였습니다 -eq. [[단어 분할이 없다는 것을 몰랐습니다 . 감사. 개인적으로, 나는 여전히 좋은 스크립팅 습관을 위해 인용하고 싶습니다
Sergiy Kolodyazhnyy

9

스크립트를로 실행하지 않으려는 경우 root문제를 해결하는 가장 안전한 방법은 맨 처음에 스크립트 실행을 중단하는 것입니다.

if [ "$EUID" = 0 ]; then
   echo "This script must NOT be run as root" 
   exit 1
fi

선택적 sudo -u FALLBACK_USER "$0"으로 단순히 중단하는 대신 스크립트를 대체 사용자 (예 :)로 다시 실행할 수 있습니다 .

개별 명령의 단점을 해결하려고하면 스크립트가 불필요하게 복잡해지고 디버깅하기가 어려워집니다. 수정 할 때마다 모든 테스트를 두 번 (일반 사용자로, 다음으로 root) 수행 root하고 발생하는 모든 관련 버그를 수정 해야합니다. 따라서 미래를 보장하는 솔루션은 아닙니다.


6

기본적으로 root accound로 작성된 파일에는 다음과 같은 권한이 있습니다.

-rw-r--r-- 1 root root 0 11 17 23:25 rootfile.txt

이 파일은 루트 사용자 및 루트 그룹에 속하며 루트로 읽고 쓸 수 있지만 다른 사람 만 읽을 수 있습니다.

가장 간단한 방법은 chown파일을 원래 사용자에게 되 돌리는 것입니다.

chown username:group_name dummy.txt

다음 과 같이 호출 $SUDO_USER될 때만 액세스 할 수있는 변수를 사용할 수 있습니다 sudo.

chown "$SUDO_USER":"$SUDO_USER" dummy.txt

일반 사용자로 스크립트를 실행하는 경우 chown부분이 전혀 필요하지 않으므로 &&스크립트가 루트로 실행될 때 if 문 또는 테스트를 사용하여 사례를 테스트하고 다음 행을 따라 무언가를 수행하는 것이 좋습니다 .

#!/bin/bash
touch dummy.txt
[ $UID -eq 0 ] && chown "$SUDO_USER":"$SUDO_USER" dummy.txt

위의 방법을 권장합니다. chmod사용자 및 그룹에 대한 읽기-쓰기-실행 권한을 변경 하는 데 사용 하는 것과 같은 다른 것들이 있지만 권장되지는 않습니다.


답장을 보내 주셔서 감사합니다. 그러나 QI에서 실제 시나리오에서 간단한 시나리오를 설명하면 원본 스크립트가 많은 파일을 생성합니다. 리눅스에서는 단순히 sudo를 무시할 수 없습니까?
익명

1
@Anonymous으로 전체 스크립트를 실행하는 경우 sudo아니요-무시할 수 없습니다. 귀하의 옵션은 일반 사용자로 스크립트를 실행하거나 (여기서 사용자를 위해 파일을 작성하기 때문에 왜하지 않는지 이해하지 못합니다) 내 대답에 표시된 것처럼 파일 소유권을 변경하십시오.
Sergiy Kolodyazhnyy

이것이 가장 올바른 솔루션이며 확장하기가 어렵지 않아야합니다.
병아리
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.