매개변수를 사용하여 사용자로 스크립트 실행

매개변수를 사용하여 사용자로 스크립트 실행

나는 스크립트를 실행할 때 스크립트가 실행되기 전에 해당 사용자에게 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

관련 정보