스크립트에서 su를 실행할 때 .bash_rc 소스 가져오기

스크립트에서 su를 실행할 때 .bash_rc 소스 가져오기

sudo 권한으로 실행해야 하는 스크립트를 작성 중입니다. 하지만 일부 환경 변수가 오버로드된 다른 사용자로부터 명령을 실행한 다음 .bash_rc이를 명령에 사용해야 합니다.

예를 들어. PATH사용자를 위한 변수를 인쇄 해야 합니다 .

sudo -s -u ${USER_NAME} source ~/.bash_rc; echo $PATH

그러나 PATH스크립트를 실행하는 사용자에게는 인쇄됩니다. 또한 다른 옵션(rcfile 사용 또는 전달)도 많이 시도했지만 su아무 것도 작동하지 않는 것 같습니다.

이 문제를 어떻게 처리해야 합니까?

답변1

sudo스크립트를 가져오는 명령이 있습니다 . 인쇄 명령도 있습니다 $PATH. 그 둘은 달리 관련이 없습니다.

어쩌면 다음과 같은 뜻일 수도 있습니다.

sudo -u "${USER_NAME}" bash -c 'source ~/.bash_rc; echo $PATH'

복합 명령과 함께 사용할 수 없지만 -s두 개 이상의 명령이 포함된 스크립트와 함께 사용할 수 있습니다.

cat >/opt/bin/show_me_the_path <<'X'
#!/bin/bash
source ~/.bash_rc
echo $PATH
X
chmod a+x /opt/bin/show_me_the_path

sudo -u "${USER_NAME}" -s /opt/bin/show_me_the_path

그러나 그것조차도 스크립트가 자체 쉘( )을 사용해야 하기 때문에 별 의미가 없습니다 /bin/bash. 전체적으로 이 -s로고를 재고하는 것이 가장 좋습니다.

답변2

다음과 같이 실행할 수 있습니다.

sudo su - ${USER_NAME} -c 'source ~/.bash_rc; echo $PATH'

실행한 예입니다. 사용자 "zippy"에는 ~/.bash_rc 파일이 있습니다. 이는 표준 ~/.bashrc 파일에 추가되는 것입니다. 사용자가 "bschuck" 명령을 실행하면 이런 일이 발생하지 않습니다. ~zippy/.bash_rc 파일에는 다음이 포함됩니다.

#!/bin/bash
# .bash_rc
PATH=$PATH:/this/is/a/dummy/path

이 명령을 실행하면 작동합니다.

bschuck@valhalla:~$ sudo su - zippy -c 'source ~/.bash_rc; echo $PATH'
/home/zippy/bin:/home/zippy/.local/bin:\
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/snap/bin:\
/this/is/a/dummy/path

그러나 이 명령은 ~zippy/.bash_rc 파일의 새 PATH를 유지하지 않습니다.

bschuck@valhalla:~$ sudo -i -u zippy bash -c 'source ~/.bash_rc; echo $PATH'
/home/zippy/bin:/home/zippy/.local/bin:/usr/local/sbin:\
/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin:\
/snap/bin

여러 명령을 실행해야 하는 경우 어제 내 답변에 대한 설명에서 제안한 대로 해당 명령을 스크립트에 넣는 것이 좋습니다.

관련 정보