HEREDOC을 사용하여 sudo를 실행할 수 있습니까?

HEREDOC을 사용하여 sudo를 실행할 수 있습니까?

편집: @Kusalananda의 답변 이후 수정된 예입니다. 내 모든 상황은 더 복잡했습니다. 여러 명령과 변수 정의가 필요합니다)

su루트가 아니고 비밀번호를 입력하고 싶지 않아서 사용할 수 없습니다

동료의 스크립트에서 su 코드를 모방하려고 했습니다.

# script runs as root
su - oracle -- "export DATA=$val; cat <<CHK
test 
CHK"
Password:
test

다음은 작동하지 않습니다(오류 출력).

$ export val=534
$ sudo -i -u oracle -- "export DATA=$val;cat <<CHK
test
CHK"
-ksh: export DATA=534;cat <<CHKtestCHK: not found
[127]$

이것은 둘 다 아닙니다(전혀 출력 없음).

$ sudo -i -u oracle -- ksh -c "export DATA=$val;cat <<CHK
test
CHK"
$ 

sudo어느 정도 는 이해한다평평한들어가지만,만수도이는 매개변수에서만 언급되고 공백으로 구분되지만 여기서는 그렇지 않습니다.

답변1

실행하는 명령의 일부로 이 문서를 리디렉션할 필요는 없습니다 sudo.

sudo -u oracle env DATA="$val" cat <<END
this is
the here-document
END

sudo유틸리티는 표준 입력 스트림을 실행하는 명령에 전달합니다. 이 env도구는 특정 유틸리티를 실행하기 전에 환경을 수정합니다. 위에 표시된 대로 이를 사용하면 대부분의 변수에 대한 환경이 지워지 더라도 sudo실행하려는 유틸리티에서 환경 변수를 설정하는 방법입니다 .sudosudo

명령이 변수를 설정하고 실행하는 것보다 더 복잡한 경우 스크립트에서 수행해야 하는 작업을 cat수집한 다음 스크립트를 실행하는 것이 좋습니다 .sudo

#!/bin/sh

export DATA="something"

cat <<END
this is
the here-document
END

이 문자열은 something스크립트의 명령줄에서도 얻을 수 있습니다. 또는 명령문을 완전히 생략하고 대신 스크립트를 실행할 때 이전에 표시된 대로 설정할 수 있습니다 DATA.env

sudo env DATA="$var" ./myscript

관련 정보