Bash, 새 쉘을 호출 한 후 명령 실행 나는 새로운

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

#!/bin/bash
sudo -s
something...

내가 그것을 실행할 때, 나는 새로운 쉘을 얻지 somethingsudo -s내부가 아닌에 의해 생성 된 쉘을 종료 할 때만 실행된다 .

어떤 도움?



답변

문제는 sudo -s인수 가 없으면 루트에 대한 대화식 쉘을 여는 것입니다.

를 사용하여 단일 명령을 실행하려는 경우 sudo -s간단하게 수행 할 수 있습니다.

sudo -s command

예를 들면 다음과 같습니다.

$ sudo -s whoami
root

또는 여기 문자열을 사용할 수 있습니다 :

$ sudo -s <<<'whoami'
root

여러 명령이있는 경우 여기에서 doc 사용할 수 있습니다 :

$ sudo -s <<'EOF'
> whoami
> hostname
> EOF
root
something--

답변

다른 방법은 전체 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

답변

Bourne 쉘은-c당신이 뭔가를 쓸 수 있도록, 당신은 쉘에 임의의 스크립트를 통과하는 데 사용할 수있는 플래그를

sudo sh -c 'something'

그러나 이것은 스크립트를 정확하게 인용하는 것이 매우 번거롭고 ssh를 통해 원격 서버에 명령을 보내면 인수 스크립트가 한 번에 두 번, 두 번 분석되므로 불편 함이 더 커지므로 가장 간단한 명령에만 유용합니다. 스크립트를 전송하고 스크립트를 실행하는쪽에 한 번.

something복잡한 스크립트이거나 ssh 행을 통해 전달되어야하는 경우 , stdoutprepare_something_script 에 스크립트 ‘something’ 을 작성하는 기능 을 수행 하는 것이 일반적 입니다. 가장 간단한 형태로이 함수는 here-document를 사용하여 출력을 생성 할 수 있습니다.

prepare_something_script()
{
  cat <<EOF
something
EOF
}

prepare_something_script그런 다음에 의해 생성 된 스크립트 는 다음 과 같이 sudo가 부여한 권한으로 로컬에서 실행될 수 있습니다 .

prepare_something_script | sudo sh

스크립트가 sudo에 의해 부여 된 권한으로 원격으로 실행되어야하는 시나리오에서 다음 과 같이 ssh 의 표준 입력을 재지 정하지 않도록 스크립트를 기본 64로 인코딩하는 것이 일반적입니다 .

something64=$(prepare_something_script | base64)
ssh usesr@remote-host "echo ${something64} | base64 --decode | sudo sh"

함수에서 해당 코드를 사용하는 경우 something64 변수를 local 로 표시하는 것을 잊지 마십시오 . base64의 일부 구현은 -d디코딩 할 플래그를 제공하는데 , 이는 verbose --decode변형 보다 덜 지원됩니다 . 일부 구현에서는 -w 0잘못된 줄 바꿈을 피하기 위해 인코딩 명령에 a를 추가해야 합니다.


답변

다음 줄 대신 sudo -s 앞에 명령을 추가해야합니다.

sudo -s something...