다른 사용자로 스크립트의 일부를 어떻게 실행할 수 있나요?

다른 사용자로 스크립트의 일부를 어떻게 실행할 수 있나요?
#!/bin/ksh
(some code)
Log=~/my.log
chown USER1 filename

su - USER1 -c "
date | tee -a ${Log} 2>&1; 
cd /blah/blah
if [ SOMECONDITION ]
then
sh ./somescript.ksh > logfile
fi
exit" | tee -a ${Log} 2>&1;

스크립트는 USER1로 전환할 때 중지되는 경향이 있으며 수동으로 종료해야 할 때 다시 실행됩니다.

답변1

비밀번호를 묻는 메시지가 표시되고 비밀번호를 얻지 못하기 때문에 스크립트가 "su" 명령에서 중지될 것으로 예상됩니다.

종종 이에 대한 여러 솔루션이 있습니다 :)

"su" 대신 표준 입력에서 비밀번호를 허용하는 -S 스위치가 있는 "sudo"를 사용하십시오.

echo "password" | sudo -S -u USER1 sh -c "...

또는 다른 사용자로 실행해야 하는 애플리케이션/스크립트의 해당 섹션을 도우미 애플리케이션으로 이동하세요. 그런 다음 해당 도우미 애플리케이션에서 set-uid 및 set-gid를 사용하여 저장된 일반 텍스트 비밀번호(일부 보안 문제가 있음)로 스크립팅을 방지할 수 있습니다.

chown USER1.GRP1 helperapp
chmod 6755 helperapp

이로 인해 발생하는 위험은 이제 시스템의 누구나 USER1로 helperapp을 실행할 수 있다는 것입니다. set-uid/gid를 사용하는 대신 특정 사용자가 비밀번호 프롬프트 없이 het helperapp을 USER1로 실행하도록 허용하기 위해 sudo 구성을 사용할 수 있습니다(관리자/루트 권한 필요).

# /etc/sudoers
# Allow USER2 to run helperapp as USER1 without prompting for a password
USER2 ALL=(USER1) NOPASSWD:/path/to/helperapp

그러면 코드는 다음과 같이 보일 수 있습니다.

#!/bin/ksh
(some code)
Log=~/my.log
chown USER1 filename

sudo -u USER1  /path/to/helperapp |  tee -a ${Log} 2>&1;

이 중 어느 것도 테스트되지 않았으며 위험을 감수하고 사용하십시오.

답변2

을 실행 중이므로 로그인 셸을 실행하라는 su -메시지가 표시됩니다 . su로그인 쉘은 -c인수를 무시하고 대신 대화식으로 명령을 읽습니다. 해결책은 통과하지 않는 것입니다 -.

대상 사용자의 시작 파일을 읽으려면 명시적으로 수행하십시오.

su - USER1 <<EOF
date
if [ -e ~/.profile ]; then . ~/.profile; fi
EOF 2>&1 | tee -a -- "$LOG"

관련 정보