로컬 bash 스크립트를 SSH에 전달하기 전에 변수 확장

로컬 bash 스크립트를 SSH에 전달하기 전에 변수 확장

SSH를 통해 원격 호스트에서 스크립트를 실행하려고 합니다. 이 스크립트는 다음에서 사용됩니다.현지의껍데기. 스크립트의 변수는 확장되지 않습니다.

ssh user@host 'bash -s' < script.sh

콘텐츠 script.sh:

#!/bin/bash

docker pull "$IMAGE"

원격 호스트에서 다음과 같이 실행합니다.

docker pull ""

오류 출력에 표시된 대로:

참조를 해결하는 중 오류가 발생했습니다. ""는 유효한 저장소/태그가 아닙니다. 저장소 이름에는 구성 요소가 하나 이상 있어야 합니다.

명령 대체를 사용해 보았습니다.

ssh user@host < $(cat script.sh)

그 결과는 다음과 같습니다.

bash: 95행: $(cat script.sh): 모호한 리디렉션

script.shSSH를 통해 명령을 전달하기 전에 변수를 어떻게 확장합니까?

답변1

원칙적으로 SSH를 통해 원격으로 환경 변수를 보낼 수 있지만 최소한 OpenSSH는 서버에서 이를 허용하지 않으며 클라이언트에서 환경 변수를 보내려고 시도하지 않습니다. 관련 구성 옵션은 (서버) 및 (클라이언트) AcceptEnv에 있습니다 .sshd_configSendEnvssh_config

여기서 구성을 변경할 수 없거나 변경하고 싶지 않다고 가정하면 어쨌든 전체 스크립트를 원격 stdin으로 보내기 때문에 해당 스크립트 앞에 변수 할당을 붙여넣을 수도 있습니다.

export -p원격 쉘이 이를 할당하는 데 사용할 수 있는 형식을 사용하여 현재 쉘에서 내보낸 모든 변수를 인쇄 할 수 있습니다 . 그러면 리모컨은 스크립트를 처리하고 평소와 같이 변수를 설정할 수 있습니다.

그래서 script.sh포함

echo "$FOO" "$HOSTNAME"

그러면 FOO로컬 셸로 내보낸 다음 내보낸 모든 변수의 정의와 스크립트 자체를 원격으로 전달합니다. 결과 출력에는 FOO방금 설정한 값이 포함됩니다.

$ export FOO=abc123
$ (export -p; cat script.sh) | ssh user@remotehost  'bash -s' 
FOO: abc123 HOSTNAME: remotehost

(Bash에는 여기에 작은 문제가 있습니다. 일반 모드에서는 표준 명령 대신 명령을 export -p인쇄합니다 . 이는 다른 쉘에서는 지원되지 않을 수 있습니다. 따라서 로컬 쉘이 Bash이고 표준 명령을 원격으로 실행하면 오류가 발생합니다. )declareexportsh

관련 정보