centos7에 bash 스크립트가 있고 다른 사용자로 일부 명령을 실행해야 합니다. 그러나 sudo
함수 외부에서는 예상대로 작동하지만 bash 함수 내부에서는 작동하지 않는 것 같습니다 . 다음과 같이 스크립트를 실행합니다.ssh [email protected] 'bash -s' < script.sh
test(){
sudo -Eu root bash
echo "inside $(whoami)"
# other commands ...
}
test
sudo -Eu root bash
echo "outside $(whoami)"
다음과 같이 실행하세요.
ssh [email protected] 'bash -s' < script.sh
인쇄:
outside root
inside centos
root
사용자는 재현성의 예로 제공됩니다. 이 결과의 이유는 무엇입니까? 다른 사용자로서 함수 내에서 여러 명령을 실행하는 방법은 무엇입니까?
답변1
이렇게 하지 마십시오.
잘못된 순서로 두 줄의 출력을 얻으면 뭔가 잘못되었음을 암시해야 합니다.
다음을 사용하여 스크립트를 실행할 때
ssh [email protected] 'bash -s' < script.sh
다음과 같은 일이 발생합니다.
- 스크립트는
bash -s
쉘의 표준 입력 스트림으로 전달됩니다. - 스크립트는
test
함수를 정의하고 호출합니다. sudo bash
함수의 명령은 루트 셸을 시작합니다.- 이 쉘은 스크립트인 표준 입력 스트림을 상속합니다.
- 루트 쉘은 함수 호출 이후부터 계속해서 스크립트를 읽습니다. 이는 현재 스트림이 있는 곳이기 때문에 수행됩니다.
이제 함수 내부에서 호출 후 명령을 실행하는 test
루트 셸이 시작되었습니다.test
- 표준 입력 스트림(즉, 쉘 스크립트 스트림)을 상속하는 두 번째 루트 쉘을 시작합니다.
이제 centos
루트 셸을 실행하고 루트 셸을 실행하는 셸이 생겼습니다.
- 두 번째 루트 셸은 스크립트의 마지막 줄인
echo "outside $(whoami)"
출력을 실행합니다.outside root
- 더 이상 읽을 내용이 없으므로 두 번째 루트 셸이 종료됩니다.
- 첫 번째 루트 셸도 마찬가지입니다.
- 원래
bash -s
셸이 실행되고echo "inside $(whoami)"
(이전에 실행을 시작한 함수의 일부이기 때문에)inside centos
. - 쉘 함수 호출이 종료되고 두 루트 쉘 모두 스크립트의 나머지 부분을 읽었으므로 원래 쉘은 더 이상 아무것도 읽을 필요가 없으며 종료됩니다.
sudo
다른 명령을 실행하거나 대화형 셸을 시작하는 데 엄격하게 사용됩니다. 사용자가 변경한 내용은 다른 명령에만 적용됩니다. 명령이 종료되면 원래 사용자로 복원됩니다. 스크립트 중간에 "다른 사용자로 전환"을 사용한 다음 스크립트의 일부를 해당 다른 사용자로 실행할 수 없습니다 sudo
(물론의도적으로위에서 풀어낸 이상한 방식으로 수행하도록 스크립트를 작성하십시오. 그러나 이 코딩은 난독화된 코드 경쟁의 일부입니다.
스크립트에서 루트로 명령 세트를 실행하려면 호출에 명령을 제공해야 합니다 sudo
. 예를 들어:
sudo bash -c 'echo "Now running as $USER"; echo "whoami outputs $(whoami)"'
명령이 종료되면 sudo bash -c
원래 사용자로 복원됩니다. 언제나.
답변2
시작된 쉘에서 명령을 실행해야 합니다 sudo
.
$ f() {
sudo -Eu root bash -c whoami
}
$ f
root