ssh를 사용하여 내 컴퓨터에서 명령을 실행하고 환경 변수를 전달하고 싶습니다. $BUILD_NUMBER
내가 시도하는 것은 다음과 같습니다.
ssh pvt@192.168.1.133 '~/tools/myScript.pl $BUILD_NUMBER'
$BUILD_NUMBER
ssh를 호출하는 시스템에 설정되어 있으며 변수가 원격 호스트에 존재하지 않기 때문에 선택되지 않습니다.
의 값을 $BUILD_NUMBER
어떻게 전달 합니까?
ssh를 사용하여 내 컴퓨터에서 명령을 실행하고 환경 변수를 전달하고 싶습니다. $BUILD_NUMBER
내가 시도하는 것은 다음과 같습니다.
ssh pvt@192.168.1.133 '~/tools/myScript.pl $BUILD_NUMBER'
$BUILD_NUMBER
ssh를 호출하는 시스템에 설정되어 있으며 변수가 원격 호스트에 존재하지 않기 때문에 선택되지 않습니다.
의 값을 $BUILD_NUMBER
어떻게 전달 합니까?
답변:
사용하는 경우
ssh pvt@192.168.1.133 "~/tools/run_pvt.pl $BUILD_NUMBER"
대신에
ssh pvt@192.168.1.133 '~/tools/run_pvt.pl $BUILD_NUMBER'
쉘은 $BUILD_NUMBER
명령 문자열을 원격 호스트에 보내기 전에 보간합니다 .
(이 대답은 불필요하게 복잡해 보일 수 있지만 내가 아는 한 공백 및 특수 문자와 관련하여 쉽게 확장 가능하고 강력합니다.)
ssh
명령 의 표준 입력을 통해 바로 데이터를 공급 read
하고 원격 위치에서 데이터를 공급할 수 있습니다 .
다음 예에서
ssh
의 이름과 값을 제공하는 null로 끝나는 줄에 제공합니다.shh
명령 자체, 우리는이 라인을 통해 루프 필요한 변수를 초기화합니다.# Initialize examples of variables.
# The first one even contains whitespace and a newline.
readonly FOO=$'apjlljs ailsi \n ajlls\t éjij'
readonly BAR=ygnàgyààynygbjrbjrb
# Make a list of what you want to pass through SSH.
# (The “unset” is just in case someone exported
# an associative array with this name.)
unset -v VAR_NAMES
readonly VAR_NAMES=(
FOO
BAR
)
for name in "${VAR_NAMES[@]}"
do
printf '%s %s\0' "$name" "${!name}"
done | ssh user@somehost.com '
while read -rd '"''"' name value
do
export "$name"="$value"
done
# Check
printf "FOO = [%q]; BAR = [%q]\n" "$FOO" "$BAR"
'
산출:
FOO = [$'apjlljs ailsi \n ajlls\t éjij']; BAR = [ygnàgyààynygbjrbjrb]
필요하지 않은 export
경우 declare
대신 을 사용할 수 있습니다 export
.
정말 단순화 된 버전 과 같을 것이다 (당신이 확장 필요하지 않은 경우 등의 과정을 하나의 변수가) :
$ ssh user@somehost.com 'read foo' <<< "$foo"
기본적으로 SSHD에서 허용되는 환경 변수 목록에는 LC_*
. 그러므로:
LC_MY_BUILDN="1.2.3" ssh -o "SendEnv LC_MY_BUILDN" ssh-host 'echo $LC_MY_BUILDN'
1.2.3
이전에 대답했듯이 원격 호스트에서 환경 변수를 설정할 필요가 없습니다. 대신 로컬 호스트에서 메타 확장을 수행하고 값을 원격 호스트에 전달할 수 있습니다.
ssh pvt@192.168.1.133 '~/tools/run_pvt.pl $BUILD_NUMBER'
원격 호스트에 환경 변수를 설정하고 사용하고 싶다면 env
프로그램을 사용할 수 있습니다.
ssh pvt@192.168.1.133 "env BUILD_NUMBER=$BUILD_NUMBER ~/tools/run_pvt.pl \$BUILD_NUMBER"
이 경우 이것은 약간의 과잉입니다.
env BUILD_NUMBER=$BUILD_NUMBER
로컬 호스트에서 메타 확장을 수행합니다.BUILD_NUMBER
환경 변수는 ssh를 통해 명시 적으로 환경 변수를 전달할 수도 있습니다. 서버 측 설정이 필요하므로 이것은 보편적 인 대답이 아닙니다.
필자의 경우에는 키를 저장하지 않고 백업 저장소 서버의 명령에 백업 저장소 암호화 키를 전달하고 싶었지만 모든 환경 변수는 ps
! stdin에 키를 전달하는 솔루션도 작동하지만 너무 번거 롭다는 것을 알았습니다. 어쨌든 ssh를 통해 환경 변수를 전달하는 방법은 다음과 같습니다.
서버에서 sshd_config
일반적으로 파일을 편집하고 전달하려는 변수 /etc/ssh/sshd_config
와 AcceptEnv
일치 하는 지시문을 추가합니다 . 을 참조하십시오 man sshd_config
. 제 경우에는 borg 백업에 변수를 전달하고 싶으므로 다음을 선택했습니다.
AcceptEnv BORG_*
이제 클라이언트에서 -o SendEnv
옵션을 사용하여 환경 변수를 보냅니다. 다음 명령 줄은 환경 변수를 설정 BORG_SECRET
한 다음 클라이언트 시스템으로 보낼 플래그를 지정합니다 (라고 함 backup
). 그런 다음 printenv
거기에서 실행 되고 BORG 변수에 대한 출력을 필터링합니다.
$ BORG_SECRET=magic-happens ssh -o SendEnv=BORG_SECRET backup printenv | egrep BORG
BORG_SECRET=magic-happens
LC_*
허용 변수, 그래서 그냥 사용 보내로서 $LC_TvE_foo
, 또는 $LC_BORG_SECRET
단지 당신이 내장 변수 "에서 충돌"을하지 할 수 있도록.
ssh 세션 외부의 변수에 액세스하려면 변수를 이스케이프하십시오. ssh pvt@192.168.1.133 "~ / tools / myScript.pl \ $ BUILD_NUMBER"
'$FOO'
동일하다 "\$FOO"
. 질문은 "SSH로 쉘 변수를 전달하는 방법"이었습니다. @PatrickTrentin에서 이미 언급했듯이 BUILD_NUMBER
환경 변수가 원격으로 설정되지 않았기 때문에 정답 이 아닙니다.