sudo sudo가 없습니다. 이는 스크립트에 sudo가 있음을 의미합니다.

sudo sudo가 없습니다. 이는 스크립트에 sudo가 있음을 의미합니다.

설계상 sudo 권한이 필요한 일부 기능을 포함하는 일부 스크립트를 만들었습니다. 어디에서나 호출할 수 있도록 .bashrcfor Linux및 for .bash_profile에 이러한 경로를 추가했습니다 .MacOS

sudo하지만 사용자가 이러한 스크립트 함수를 호출할 때마다 입력하는 것을 원하지 않습니다 . sudo이러한 함수가 호출될 때마다 터미널이 루트 사용자로부터 호출되고 있다고 가정한다는 것을 암시하는 방법이 있습니까 ?

sudo -i스크립트 시작 부분에 추가 해야 할 것 같은데요 , 아니면 각 함수의 시작 부분에 추가해야 할까요? 아니면 다른 대체 힌트가 있습니까 sudo? 또한 sudo를 암시하는 것이 나쁘거나 위험하다고 생각하고 권장되지 않는 경우 알려주시면 감사하겠습니다.

dangerous-function지정하지 않고 수행하려는 일부 기능이 포함된 스크립트 예sudo

#!/bin/bash
start-one()
{
    ## do dangerous stuff with sudo
    systemctl start dangerous.service
}

start-two()
{
    systemctl start dangerous1.service
}

start-launchwizard()
{
    systemctl start dangerous2.service
}

## Calling functions one by one...
"$@"

나는 그들에게 전화하고 싶지 않고 sudo dangerous-function start-one 단지 전화하고 싶지만 dangerous-function start-one여전히 이전 것과 동일한 결과를 얻습니다.

답변1

"$@"개별적으로 인용된 명령줄 인수 목록으로 확장 됩니다 . 즉, 다음을 사용하여 스크립트를 호출하면

./script.sh start-one

해당 시간에 실행 됩니다 start-one(이것이 귀하의 기능입니다). 그것반품이라고 부른다는 뜻이다.

./script.sh ls

실행될 것입니다 ls.

sudo사용자가 호출 스크립트를 사용 (또는 sudo스크립트 내에서 사용) 하도록 허용하면 sudo액세스 권한이 있는 경우 루트로 모든 명령을 실행할 수 있습니다. 당신은 이것을 원하지 않습니다.

대신 명령줄 매개변수를 주의 깊게 확인해야 합니다. 어쩌면 좋아

foo_func () {
    # stuff
    printf 'foo:\t%s\n' "$@"
}

bar_func () {
    # stuff
    printf 'bar:\t%s\n' "$@"
}

arg=$1
shift

case $arg in
    foo)
        foo_func "$@" ;;
    bar)
        bar_func "$@" ;;
    *)
        printf 'invalid sub-command: %s\n' "$arg" >&2
        exit 1
esac

시험:

$ sh script.sh bar 1 2 3
bar:    1
bar:    2
bar:    3
$ sh script.sh baz
invalid sub-command: baz

이것은 ~이 될 것이다더 안전한와 함께 사용 sudo하지만 여전히 다양한 기능에서 사용자가 제공하는 어떤 것도 실행하고 싶지 않습니다.곧장입력 내용을 정리할 필요가 없습니다. 위의 스크립트는 사용자를 특정 하위 명령 집합으로 제한하여 이를 수행하며, 하위 명령을 처리하는 각 함수는 다음을 수행합니다.아니요eval또는 해당 매개변수를 실행합니다 source.

다른 말로 다시 말하면 이렇습니다.스크립트는 어떤 방식으로든 사용자 입력을 코드로 실행하지 않으며 시도해서도 안 됩니다.. 인수가 현재 환경에서 실행할 수 있는 함수에 해당하는지 알아내려고 해서는 안 되며(함수는 호출 환경에 의해 거기에 배치되었을 수 있음) 경로 이름이 현재 환경에 제공되는 스크립트를 실행해서는 안 됩니다. 명령줄 등

스크립트가 관리 작업을 수행하는 경우 다음을 사용하여 실행 sudo하고 싶습니다.스크립트 자체특히 비대화형(예: cron 작업)으로 실행하려는 스크립트인 경우 비밀번호를 묻습니다. 즉, 루트 권한이 필요한 관리 작업을 수행하는 스크립트는 (IMHO) 다음을 수행할 수 있어야 합니다.생각하다처음부터 올바른 권한으로 실행됩니다.

네가 원한다면시험스크립트에서는 다음을 수행할 수 있습니다.

if [ "$( id -u )" -ne 0 ]; then
    echo 'please run this script as root' >&2
    exit 1
fi

그러다가 결정을 내린다어떻게스크립트 사용자로서 루트 권한으로 스크립트를 실행합니다.

답변2

/etc/sudoers사용자가 액세스할 수 있도록 스크립트를 추가할 수 있습니다 (바람직하게는 "visudo" 사용).

user ALL= /path/to/script

그러면 사용자는 sudo 없이 실행할 수 있습니다 path/to/script.

관련 정보