su 사용자 이름 -c "./script.sh" 및 sudo -u 사용자 이름 bash -c "./script.sh" 및 Java 클래스 경로 문제

su 사용자 이름 -c "./script.sh" 및 sudo -u 사용자 이름 bash -c "./script.sh" 및 Java 클래스 경로 문제

su username이 두 명령 중 하나를 실행할 때의 환경이 사용자로서 명령을 하나씩 사용하고 실행할 때의 환경과 어떻게 다른지 궁금하게 만드는 이상한 동작이 보입니다 .

su username -c "cd /opt/scripts/ ; ./script.sh"

sudo -u username bash -c "cd /opt/scripts/ ; ./script.sh"

CentOS 6 Linux 서버의 루트로 init 스크립트에서 이러한 명령을 실행했습니다.

문제는 Java 프로그램을 실행하는 script.sh 파일이 (script.sh가 위치한 위치에 상대적인) 상대 경로(예: ./classes/com:./lib/common)가 있는 클래스 경로 지시문을 사용한다는 점을 더 지적해야 합니다. ). 사용자 이름을 su로 입력한 다음 /opt/scripts로 cd하고 ./script.sh를 실행하면 작동하지만 스크립트를 실행하기 전에 cd로 이동하더라도 스크립트 내의 su 및 sudo 명령 모두 클래스를 찾지 못하는 문제가 있는 것 같습니다. 디렉토리. 왜 그럴까요? su를 사용하여 사용자가 되는 것과 명령을 하나씩 실행하는 것의 차이점은 무엇입니까?

답변1

환경을 비교해 보세요.

$ sudo -s
# diff <(su username -c env) <(sudo -u username bash -c env)

예를 들어 의 환경은 기본적으로 에서 제어됩니다 sudo.env_*/etc/sudoers

관련 정보