나는 스크립트를 실행할 때 스크립트가 실행되기 전에 해당 사용자에게 su를 요청하지 않고도 특정 사용자로 실행되도록 노력하고 있습니다. 스크립트는 다음과 같은 여러 플래그와 함께 실행됩니다.
./myscript.sh -e dev -v 1.9
나는 다음을 시도했다
[ `whoami` = myuser ] || exec sudo -S su - myuser -c "bash `pwd`/`basename $0` $@"
하지만 -v 플래그는 내 스크립트에 입력되어야 하는데 su에 대한 입력으로 사용되고 있습니다. 그래서 잘못된 옵션에 대해 불평합니다. 위의 문제를 해결할 수 있는 방법이 있습니까?
참고: 스크립트를 실행하는 사람에게는 sudo 권한이 있습니다.
답변1
현재 사용자가 이미 변수에 있습니다 $USER
. 따라서 필요한 것은 다음과 같습니다.
[ "$USER" = "myuser" ] || sudo -u myuser $0 "$@"
필요 없음의 경우 sudo su
필요한 sudo
모든 작업을 수행할 수 있습니다. 필요하지 않거나 pwd
변수 basename
에 $0
이미 스크립트의 전체 경로가 있습니다.
원래 명령은 로그인 셸( su -
)을 시작하는 것이었습니다. 정말로 필요한 경우(이상해 보이지만) 다음과 같이 할 수 있습니다.
[ "$USER" = "myuser" ] || sudo -iu myuser $0 "$@"
답변2
스크립트에 두 가지 문제가 있습니다.
1) 테스트 명령에서 공백을 잊어버렸습니다.[`whoami` = myuser]
2) 변수 "$@"이 두 단계로 확장되므로 참조가 손실됩니다.
내 시스템에서는 다음이 작동하는 것 같습니다.
[ `whoami` = myuser ] || exec sudo -S -u myuser bash -- "$0" "$@"
답변3
만약에전체 스크립트su
특정 사용자가 실행해야 하며, 스크립트를 실행하는 사용자에게 적합하다고 판단되는 방식으로( 를 통해 sudo
또는 다른 방식으로) 올바른 사용자 ID로 변경하도록 맡깁니다 .
이렇게 하면 스크립트가 단순화되고 사용이 더 쉬워집니다. 특히, 사용자가 올바른 신원을 추측할 수 없는 상황을 "수정"할 필요가 없습니다. 개인적으로 나는 이것을 올바른 명령줄 옵션을 사용하지 못한 것과 유사한 호출의 버그로 봅니다.
분명히 스크립트는 올바른 사용자가 실행하고 있는지 확인할 수 있습니다.
if [ "$USER" != "correctuser" ]; then
echo 'Must be run by "correctuser"' >&2
exit 1
fi
일반 사용자는 다음을 사용하여 스크립트를 실행합니다.
sudo -u correctuser ./script.sh -e dev -v 1.9
그리고 루트 사용자는 다음을 원할 수도 있습니다.
su correctuser -c ./script.sh -e dev -v 1.9