Bash, 새 쉘을 호출한 후 명령을 실행하십시오.

Bash, 새 쉘을 호출한 후 명령을 실행하십시오.

다음과 같은 스크립트를 만들려고 합니다.

#!/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비트 기반-dverbose 변형보다 덜 지원되는 디코딩할 플래그를 제공합니다 --decode. 일부 구현에서는 -w 0가짜 개행을 방지하기 위해 인코딩 명령에 a를 추가해야 합니다.

답변4

다음 줄이 아닌 sudo -s 앞에 명령을 추가해야 합니다.

sudo -s something...

관련 정보