다음과 같은 스크립트를 만들려고 합니다.
#!/bin/bash
sudo -s
something...
실행하면 새 셸이 생기지만 셸 내부가 아닌 something
에서 만든 셸을 종료할 때만 실행됩니다 .sudo -s
도움이 필요하세요?
답변1
또 다른 방법은 전체 bash 명령을 다음에 전달하는 것입니다 sudo
.
#!/bin/bash
sudo bash -c 'command1; command2; command3;'
그러나 더 나은 접근 방식은 시작하는 것입니다.스크립트그리고 sudo
그 반대입니다. 이것을 sudo
스크립트에 넣는 것은 좋은 생각이 아닙니다. 루트 권한( )으로 전체 스크립트를 실행하는 것이 가장 좋습니다 sudo script.sh
. 필요한 경우 sudo
해당 권한을 사용하여 특정 명령을 제거할 수 있습니다. 예를 들어:
#!/usr/bin/env bash
whoami
echo $HOME
sudo -u terdon whoami ## drop privileges for specific command.
위 스크립트를 실행하면 다음이 반환됩니다.
$ sudo ~/scripts/a.sh
root
/root
terdon
답변2
문제는 sudo -s
매개변수가 루트에 대한 대화형 쉘을 열지 않는다는 것입니다.
다음을 사용하여 단일 명령을 실행하려는 경우 sudo -s
:
sudo -s command
예를 들어:
$ sudo -s whoami
root
또는 여기에 문자열을 사용할 수 있습니다.
$ sudo -s <<<'whoami'
root
여러 명령이 있는 경우 여기에서 문서를 사용할 수 있습니다.
$ sudo -s <<'EOF'
> whoami
> hostname
> EOF
root
something--
답변3
이것본 쉘-c
임의의 스크립트를 셸에 전달하는 데 사용할 수 있는 플래그가 있으므로 다음과 같이 작성할 수 있습니다.
sudo sh -c 'something'
그러나 이는 가장 간단한 명령에만 유용합니다. 스크립트를 적절하게 참조하는 것은 번거롭고 명령이 다음을 통해 원격 서버로 전송되는 경우 더욱 불편하기 때문입니다.SSH매개변수 스크립트는 스크립트를 보내는 측에서 한 번, 스크립트를 실행하는 측에서 한 번, 두 번 구문 분석되기 때문입니다.
something
복잡한 스크립트 이거나SSHprepare_something_script
좋아, 일반적인 관행은 그 위에 "뭔가"를 스크립트로 작성하는 함수를 작성하는 것입니다.표준 출력. 가장 간단한 형태로 함수는 이 문서를 사용하여 출력을 생성할 수 있습니다.
prepare_something_script()
{
cat <<EOF
something
EOF
}
prepare_something_script
그런 다음 생성된 스크립트는 부여된 권한을 사용하여 로컬로 실행될 수 있습니다.스도다음과 같이:
prepare_something_script | sudo sh
부여된 권한을 사용하여 스크립트를 원격으로 실행해야 하는 시나리오에서스도표준 입력 리디렉션을 방지하기 위해 스크립트는 일반적으로 Base 64로 인코딩됩니다.SSH, 이와 같이:
something64=$(prepare_something_script | base64)
ssh usesr@remote-host "echo ${something64} | base64 --decode | sudo sh"
함수에서 이 코드를 사용하는 경우 다음을 표시하는 것을 잊지 마세요.뭔가64변수는현지의. 일부 구현64비트 기반-d
verbose 변형보다 덜 지원되는 디코딩할 플래그를 제공합니다 --decode
. 일부 구현에서는 -w 0
가짜 개행을 방지하기 위해 인코딩 명령에 a를 추가해야 합니다.
답변4
다음 줄이 아닌 sudo -s 앞에 명령을 추가해야 합니다.
sudo -s something...