bash 스크립트에서 sudo 무시


9

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

#!/bin/bash

touch dummy.txt

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

내가하고 싶은 것은 :

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


4
"루트 보호"의 의미에 관계없이 chown및 chmod스크립트를 사용하여 원하는대로 소유권과 권한을 설정할 수 있습니다 .
— 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.