sudo를 사용하여 ssh에 명령과 지역 변수를 전달할 때 필요한 인용 및 이스케이프를 피하는 방법은 무엇입니까?

sudo를 사용하여 ssh에 명령과 지역 변수를 전달할 때 필요한 인용 및 이스케이프를 피하는 방법은 무엇입니까?

sudo를 사용하여 ssh에 명령과 지역 변수를 전달할 때 필요한 인용 및 이스케이프를 피하는 방법은 무엇입니까?

이 문서를 사용하여 인용을 피할 수 있는 창의적인 방법을 제공한 사람을 찾았습니다. 이것은 좋은 생각처럼 들리지만 bash에서는 작동하지 않습니다. 내가 찾은 제안은 다음과 같습니다.ssh $host $FOO 및 ssh $host "sudo su user -c $FOO" 유형 구성에서 참조됩니다.

답변1

이것은 기본적인 bash 스크립트 예제입니다.

# Assign values to variables locally.
myvar1="myvalue1"
myvar2="myvalue2"
# Add your local commands here.

ssh myremotehost "$(
cat <<HEREDOC_EXPORT_VARIABLES
export myvar1="$myvar1"
export myvar2="$myvar2"
HEREDOC_EXPORT_VARIABLES

cat <<'HEREDOC_SUDO'
sudo -Eu root /bin/bash <<'HEREDOC_COMMANDS'

# Optionally display your variables.
echo "myvar1: $myvar1"
echo "myvar2: $myvar2"
# Add your remote commands here.

HEREDOC_COMMANDS
HEREDOC_SUDO
)" | tee logfile.log

다양한 부분에 대한 설명.

변수는 로컬로 할당됩니다(원격 시스템에서 명령을 실행하기 전).

myvar1="myvalue1"
myvar2="myvalue2"

"$(... )"여러 명령을 함께 그룹화하고 이 블록 내에서 큰따옴표를 사용할 수 있습니다.

이 문서 블록을 내보내면(작은따옴표를 사용하지 않고) 블록 내에서 지역 변수를 사용할 수 있습니다.

cat <<HEREDOC_EXPORT_VARIABLES
...
...
HEREDOC_EXPORT_VARIABLES

원격 명령에서 사용할 로컬 변수를 내보냅니다.

export myvar1="$myvar1"
export myvar2="$myvar2"

작은따옴표로 묶인 외부 doc-here 블록은 sudo 명령을 에코하는 데 사용되며 원격 변수를 이스케이프하기 위해 내부 doc-here가 필요하지 않습니다( echo개행 없이 대체될 수 있음).

cat <<'HEREDOC_SUDO'
...
...
HEREDOC_SUDO

내부적으로 문서 블록은 원격 변수를 이스케이프할 필요가 없도록 작은따옴표로 묶여 있습니다.

sudo -Eu root /bin/bash <<'HEREDOC_COMMANDS'
...
...
HEREDOC_COMMANDS

-E옵션을 sudo사용하면 이전에 내보낸 환경 변수를 보존할 수 있습니다.

tee logfile.log출력이 터미널과 로그 파일에 동시에 반영되도록 허용합니다.

보너스로 ssh myremotehost "$(line을 다음으로 대체 echo "$(하면 디버깅 목적으로 원격 실행 부분의 출력을 얻을 수 있습니다.

"$()"팁: 주석에 사용하더라도 ... 블록 내에서 짝이 없는 작은따옴표나 큰따옴표를 이스케이프해야 할 수도 있습니다 .

관련 정보