사용자 내부 기능을 변경하는 방법

사용자 내부 기능을 변경하는 방법

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

다음과 같은 일이 발생합니다.

  1. 스크립트는 bash -s쉘의 표준 입력 스트림으로 전달됩니다.
  2. 스크립트는 test함수를 정의하고 호출합니다.
  3. sudo bash함수의 명령은 루트 셸을 시작합니다.
  4. 이 쉘은 스크립트인 표준 입력 스트림을 상속합니다.
  5. 루트 쉘은 함수 호출 이후부터 계속해서 스크립트를 읽습니다. 이는 현재 스트림이 있는 곳이기 때문에 수행됩니다.

이제 함수 내부에서 호출 후 명령을 실행하는 test루트 셸이 시작되었습니다.test

  1. 표준 입력 스트림(즉, 쉘 스크립트 스트림)을 상속하는 두 번째 루트 쉘을 시작합니다.

이제 centos루트 셸을 실행하고 루트 셸을 실행하는 셸이 생겼습니다.

  1. 두 번째 루트 셸은 스크립트의 마지막 줄인 echo "outside $(whoami)"출력을 실행합니다.outside root
  2. 더 이상 읽을 내용이 없으므로 두 번째 루트 셸이 종료됩니다.
  3. 첫 번째 루트 셸도 마찬가지입니다.
  4. 원래 bash -s셸이 실행되고 echo "inside $(whoami)"(이전에 실행을 시작한 함수의 일부이기 때문에) inside centos.
  5. 쉘 함수 호출이 종료되고 두 루트 쉘 모두 스크립트의 나머지 부분을 읽었으므로 원래 쉘은 더 이상 아무것도 읽을 필요가 없으며 종료됩니다.

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

관련 정보