원격 ssh 명령에서 변수 전달


99

ssh를 사용하여 내 컴퓨터에서 명령을 실행하고 환경 변수를 전달하고 싶습니다. $BUILD_NUMBER

내가 시도하는 것은 다음과 같습니다.

ssh pvt@192.168.1.133 '~/tools/myScript.pl $BUILD_NUMBER'

$BUILD_NUMBER ssh를 호출하는 시스템에 설정되어 있으며 변수가 원격 호스트에 존재하지 않기 때문에 선택되지 않습니다.

의 값을 $BUILD_NUMBER어떻게 전달 합니까?


1
허드슨과 관련이없는 태그를 삭제했습니다. (Hudson은 변수를 생성합니다.)
Peter Schuetze

답변:


188

사용하는 경우

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명령 문자열을 원격 호스트에 보내기 전에 보간합니다 .


8
누군가가 따옴표에 포함 된 명령이 로컬에서 평가되지 않도록 작은 따옴표를 사용해야하는 경우 " '$ VARIABLE'"을 사용해야합니다. 예 : ssh pvt@192.168.1.133 '~ / tools / run_pvt.pl "'$ BUILD_NUMBER '"'
dr.doom

3
bash가 작은 따옴표와 큰 따옴표로 다르게 반응한다는 것을 몰랐습니다. 감사!
silgon aug

1
리눅스 핵심 개발자는 지옥에서 불타 야합니다
goldstar

@goldstar, 셸에서 작은 따옴표와 큰 따옴표 동작의 차이가 Linux보다 수십 년 앞선다는 점에 유의하십시오.
sarnold

3
PSA : 문자열에 사용자 입력이 포함 된 경우 이는 매우 나쁜 생각이며 코드 삽입 공격에 노출 될 수 있습니다.
Brian McCutchon

27

작은 따옴표로 묶인 변수는 평가되지 않습니다. 큰 따옴표 사용 :

ssh pvt@192.168.1.133 "~/tools/run_pvt.pl $BUILD_NUMBER"

쉘은 작은 따옴표가 아닌 큰 따옴표로 변수를 확장합니다. 이것은 ssh명령 에 전달되기 전에 원하는 문자열로 변경됩니다 .


2

(이 대답은 불필요하게 복잡해 보일 수 있지만 내가 아는 한 공백 및 특수 문자와 관련하여 쉽게 확장 가능하고 강력합니다.)

ssh명령 의 표준 입력을 통해 바로 데이터를 공급 read하고 원격 위치에서 데이터를 공급할 수 있습니다 .

다음 예에서

  1. 인덱스 배열은 원격 측에서 값을 검색하려는 변수의 이름으로 (편의를 위해) 채워집니다.
  2. 이러한 각 변수에 대해 변수 ssh의 이름과 값을 제공하는 null로 끝나는 줄에 제공합니다.
  3. 에서 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"

2

기본적으로 SSHD에서 허용되는 환경 변수 목록에는 LC_*. 그러므로:

LC_MY_BUILDN="1.2.3" ssh -o "SendEnv LC_MY_BUILDN" ssh-host 'echo $LC_MY_BUILDN'
1.2.3

0

이전에 대답했듯이 원격 호스트에서 환경 변수를 설정할 필요가 없습니다. 대신 로컬 호스트에서 메타 확장을 수행하고 값을 원격 호스트에 전달할 수 있습니다.

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환경 변수는
    원격 쉘에서 사용됩니다 .

0

ssh를 통해 명시 적으로 환경 변수를 전달할 수도 있습니다. 서버 측 설정이 필요하므로 이것은 보편적 인 대답이 아닙니다.

필자의 경우에는 키를 저장하지 않고 백업 저장소 서버의 명령에 백업 저장소 암호화 키를 전달하고 싶었지만 모든 환경 변수는 ps! stdin에 키를 전달하는 솔루션도 작동하지만 너무 번거 롭다는 것을 알았습니다. 어쨌든 ssh를 통해 환경 변수를 전달하는 방법은 다음과 같습니다.

서버에서 sshd_config일반적으로 파일을 편집하고 전달하려는 변수 /etc/ssh/sshd_configAcceptEnv일치 하는 지시문을 추가합니다 . 을 참조하십시오 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

기본 서버 측 설정을 사용하여 변수를 "밀수"할 수 있습니다 . 내 대답을 참조하십시오 . 요점은 기본 OpenSSHd의 설정이 포함된다 LC_*허용 변수, 그래서 그냥 사용 보내로서 $LC_TvE_foo, 또는 $LC_BORG_SECRET단지 당신이 내장 변수 "에서 충돌"을하지 할 수 있도록.
Alex Stragies

-2

ssh 세션 외부의 변수에 액세스하려면 변수를 이스케이프하십시오. ssh pvt@192.168.1.133 "~ / tools / myScript.pl \ $ BUILD_NUMBER"


2
이것은 질문이 요구하는 것을 달성하지 못합니다.
Patrick Trentin

2
뷰 쉘 점에서 '$FOO'동일하다 "\$FOO". 질문은 "SSH로 쉘 변수를 전달하는 방법"이었습니다. @PatrickTrentin에서 이미 언급했듯이 BUILD_NUMBER환경 변수가 원격으로 설정되지 않았기 때문에 정답 이 아닙니다.
Gilles Gouaillardet
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.