Sudo를 사용하여 Bash 스크립트 기능 실행

Sudo를 사용하여 Bash 스크립트 기능 실행

저는 다양한 작업을 수행하는 스크립트를 가지고 있는데, 그 중 대부분은 특별한 권한이 필요하지 않습니다. 그러나 함수에 포함된 특정 부분 중 하나에는 루트 권한이 필요합니다.

전체 스크립트를 루트로 실행하도록 요구하고 싶지 않으며 스크립트 내에서 루트 권한으로 이 함수를 호출할 수 있기를 원합니다. 어쨌든 대부분 대화형이기 때문에 필요한 경우 비밀번호를 묻는 것은 문제가 되지 않습니다. 그러나 사용하려고 하면 다음과 같은 결과 sudo functionx가 나타납니다.

sudo: functionx: command not found

예상했던 대로 export별차이가 없네요. 여러 가지 이유로 함수를 분할하여 별도의 스크립트로 실행하는 대신 스크립트에서 직접 함수를 실행할 수 있기를 바랍니다.

내 함수를 추출하지 않고도 sudo에 "표시"하고 적절한 디렉터리를 찾은 다음 독립 실행형 스크립트로 실행할 수 있는 방법이 있습니까?

함수 자체는 한 페이지 정도 길이이며 여러 문자열을 포함합니다. 일부는 큰따옴표로 묶여 있고 일부는 작은따옴표로 묶여 있습니다. 또한 기본 스크립트의 다른 곳에 정의된 메뉴 기능에도 의존합니다.

sudo ANY를 사용하는 사람이 해당 기능을 실행할 수 있기를 바랍니다. 그 기능 중 하나가 비밀번호를 변경하는 것이기 때문입니다.

답변1

이 작업을 수행하는 쉽고 직관적인 방법은 없으며 약간 구식이라는 점을 인정합니다. 그러나 다음과 같이 할 수 있습니다.

function hello()
{
    echo "Hello!"
}

# Test that it works.
hello

FUNC=$(declare -f hello)
sudo bash -c "$FUNC; hello"

또는 더 간단하게:

sudo bash -c "$(declare -f hello); hello"

이것은 나에게 효과적입니다.

$ bash --version
GNU bash, version 4.3.42(1)-release (x86_64-apple-darwin14.5.0)
$ hello
Hello!
$
$ FUNC=$(declare -f hello)
$ sudo bash -c "$FUNC; hello"
Hello!

기본적으로 declare -f함수의 내용이 반환된 다음 bash -c인라인으로 전달됩니다.

FUNC=$(declare -f hello)bash의 외부 인스턴스에서 모든 기능을 내보내 려면 FUNC=$(declare -f).

편집하다

인용에 대한 의견을 처리하려면 다음 예를 참조하세요.

$ hello()
> {
> echo "This 'is a' test."
> }
$ declare -f hello
hello ()
{
    echo "This 'is a' test."
}
$ FUNC=$(declare -f hello)
$ sudo bash -c "$FUNC; hello"
Password:
This 'is a' test.

답변2

Sudo이를 위해 함수와 별칭을 호출할 수 있는 bash 함수를 직접 작성했습니다 .

function Sudo {
        local firstArg=$1
        if [ $(type -t $firstArg) = function ]
        then
                shift && command sudo bash -c "$(declare -f $firstArg);$firstArg $*"
        elif [ $(type -t $firstArg) = alias ]
        then
                alias sudo='\sudo '
                eval "sudo $@"
        else
                command sudo "$@"
        fi
}

답변3

"문제"는 sudo보안 위험으로부터 보호하기 위해 환경을 정리하고(허용된 몇 가지 변수를 제외하고) 특정 변수를 미리 정의된 안전한 값으로 설정하는 데 있습니다. 즉, 실제로는 문제가 되지 않습니다. 이것은 특징입니다.

예를 들어, PATH를 미리 정의된 값으로 설정하거나 PATH="/path/to/myevildirectory:$PATH"설정 sudo하지 않으면 실행하는 모든 명령(즉, 대부분의 스크립트)의 전체 경로 이름을 지정하지 않는 스크립트는 /path/to/myevildirectory다른 디렉터리보다 먼저 검색됩니다. ls또는 기타 일반적인 도구 와 같은 명령을 거기에 넣으면 grep시스템에서 원하는 모든 작업을 쉽게 수행할 수 있습니다.

가장 쉽고/가장 좋은 방법은 함수를 스크립트로 다시 작성하고 경로 어딘가에 저장하는 것입니다(또는 sudo명령줄에서 스크립트의 전체 경로를 지정합니다. sudo명령 실행을 허용하도록 구성 하지 않는 한 어쨌든 이 작업을 수행해야 합니다). 루트로) 실행 가능하게 만듭니다.chmod +x /path/to/scriptname.sh

쉘 함수를 스크립트로 다시 작성하는 것은 함수 정의 내의 명령을 파일에 저장하는 것만큼 간단합니다( 및 행 제외 function ...) .{}

답변4

함수와 별칭을 결합할 수 있습니다.

예:

function hello_fn() {
    echo "Hello!" 
}

alias hello='bash -c "$(declare -f hello_fn); hello_fn"' 
alias sudo='sudo '

그럼 sudo hello일해

관련 정보