슈퍼유저 권한으로 일부 명령이 실행되지 않도록 방지

슈퍼유저 권한으로 일부 명령이 실행되지 않도록 방지

저는 배쉬를 처음 접했습니다. 나는 많은 줄과 명령으로 구성된 스크립트를 작성했습니다. 여러 패키지를 가져와 설치하기 위한 설정 파일입니다. 결과적으로 다음 명령과 같이 스크립트에서 많은 설치 명령을 사용해야 합니다.

sudo apt install python2.7 python-pip

내 스크립트에서 너무 많은 것을 사용하지 않으려는 시도로 각 명령 앞에 sudo제거하고 .sudosudo ./setup.sh

잘 작동하지만 문제는 , 및 ... sudo와 같이 실제로 필요하지 않은 일부 명령이 있다는 것입니다.mkdirwget

를 사용하여 스크립트를 실행할 때 sudo ./setup.sh이 스크립트를 사용하여 생성된 디렉토리는 을 사용하지 않고 제거, 복사 또는 편집할 수 없습니다 sudo. 그러나 모든 사용자가 해당 디렉토리에 액세스할 수 있기를 원했습니다. 그러므로 내 질문은 다음과 같습니다.

sudo(예: )로 스크립트를 실행할 때 슈퍼유저 권한 이나 sudo ./setup.sh같은 내부 명령 중 일부를 실행하지 않는 방법이 있나요 ?mkdirwget

답변1

를 사용하면 전환하라고 sudo지시한 사용자(기본적으로 루트)로 새 셸을 시작합니다 . sudo그러면 SUDO_USER변수가 해당 사용자의 사용자 이름으로 설정됩니다.

$ cat foo.sh
#!/bin/bash
echo "SUDO_USER: $SUDO_USER"

이 스크립트를 직접 실행하면 변수가 설정되지 않았기 때문에 아무것도 얻지 못합니다.

$ foo.sh
SUDO_USER: 

하지만 으로 실행하면 sudo변수가 설정됩니다.

$ sudo foo.sh
SUDO_USER: terdon

이를 염두에 두고 스크립트를 실행하는 사용자의 사용자 이름을 사용하여 일반 사용자로 실행하려는 특정 명령을 간단히 실행할 수 있습니다. 따라서 스크립트에서 일반 사용자로 실행하려는 및 기타 명령을 wget변경 하고 루트 대신 일반 사용자로 실행되도록 실행하십시오.chmodsudo -u $SUDO_USER

apt install python2.7 python-pip ## will run as root
sudo -u $SUDO_USER mkdir foo ## will run as $SUDO_USER

변수 를 사용하면 SUDO_USER생성한 모든 디렉터리와 파일이 스크립트를 시작한 사용자가 소유하게 되며 스크립트를 실행할 때마다 해당 사용자의 이름을 스크립트에 명시적으로 알릴 필요가 없습니다.

답변2

mkdir로 생성된 디렉토리를 모든 사용자가 사용하도록 하려면 chmod 명령을 사용하여 권한을 WORLD 읽기/쓰기 가능으로 변경해야 합니다.

스크립트에서 를 실행한 후 mkdir아래 명령을 사용합니다.

chmod -R 755  «directory-name»

(모두 읽기 가능, 루트만 쓰기 가능)

또는

chmod -R 777  «directory-name» 

(시스템의 모든 사용자가 읽고 쓸 수 있음)

의 경우 다운로드 후 명령어를 wget사용하세요 .chmod

또는

그래도 다른 사용자로 명령을 실행하려면 su 명령을 사용하십시오.

su - «username» -c 'command to be executed'

관련 정보