저는 다양한 작업을 수행하는 스크립트를 가지고 있는데, 그 중 대부분은 특별한 권한이 필요하지 않습니다. 그러나 함수에 포함된 특정 부분 중 하나에는 루트 권한이 필요합니다.
전체 스크립트를 루트로 실행하도록 요구하고 싶지 않으며 스크립트 내에서 루트 권한으로 이 함수를 호출할 수 있기를 원합니다. 어쨌든 대부분 대화형이기 때문에 필요한 경우 비밀번호를 묻는 것은 문제가 되지 않습니다. 그러나 사용하려고 하면 다음과 같은 결과 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
일해