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