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.sh
SSH를 통해 명령을 전달하기 전에 변수를 어떻게 확장합니까?
답변1
원칙적으로 SSH를 통해 원격으로 환경 변수를 보낼 수 있지만 최소한 OpenSSH는 서버에서 이를 허용하지 않으며 클라이언트에서 환경 변수를 보내려고 시도하지 않습니다. 관련 구성 옵션은 (서버) 및 (클라이언트) AcceptEnv
에 있습니다 .sshd_config
SendEnv
ssh_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이고 표준 명령을 원격으로 실행하면 오류가 발생합니다. )declare
export
sh