다음 줄을 포함하는 쉘 스크립트가 있습니다.
CURRENT_USER=${USER}
echo $CURRENT_USER
su
echo switch to `who am i`
두 번째 줄을 실행한 후 쉘은 루트 비밀번호를 묻는 메시지를 표시합니다. 올바른 비밀번호를 입력하고 관리자로 로그인한 후 마지막 줄이 실행되지 않습니다.
이 문제의 원인은 무엇입니까?
답변1
su
새 셸을 시작합니다(또는 다른 명령을 실행합니다). 현재 쉘의 UID를 마술처럼 전환하지는 않습니다. 비밀번호를 입력한 후 입력 하면 exit
스크립트가 명령문을 계속 실행하는 것을 볼 수 있습니다 echo
(그러나 루트가 아닌 원래 사용자로).
루트로 실행되어야 하는 스크립트 부분을 별도의 스크립트에 넣고 su
.
답변2
쉘에 관한 한 su
이는 다른 명령과 같습니다. 인수 없이 실행 하면 su
루트 비밀번호를 묻는 메시지가 표시된 다음 평소와 같이 대화형 셸을 호출합니다. 대화형 셸이 종료되면 스크립트는 다음 명령을 계속 진행합니다.
너무 많은 인용 문제 없이 명령을 전달하는 su
가장 쉬운 방법 은 다음을 사용하는 것입니다.여기 문서. 인용이 골치아픈 일을 피하려면 리터럴 heredoc(따옴표가 닫는 태그를 입력하는 위치)를 사용하세요. 상위 스크립트의 셸 변수는 루트로 실행되는 스크립트에서는 사용할 수 없습니다. 환경 변수(내보낸)만 사용할 수 있습니다. 예:
ADD_USER=john
ADD_TO_GROUP=fiddlers
export ADD_USER ADD_TO_GROUP
su <<'EOF'
adduser "$ADD_USER" "$ADD_TO_GROUP"
EOF
# more commands executed as the original user
답변3
실행하면 su
새 명령이 시작됩니다(기본적으로 셸).
이 작업을 수행하려면 다음과 같이 시도해 보십시오.
#!/bin/bash
if [ `id -u` = 0 ]; then
# Do our real work as root
else
su -c $0
fi