다른 사용자로 스크립트의 일부를 실행하려면 어떻게 해야 합니까?

다른 사용자로 스크립트의 일부를 실행하려면 어떻게 해야 합니까?
#!/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" 명령에서 스크립트를 중지하고 싶습니다.

일반적으로 여러 가지 솔루션이 있습니다 :)

표준 입력에서 비밀번호를 허용하는 -S 스위치가 있는 "su" 대신 "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"

관련 정보