원격 ssh 명령에서 변수 전달 사용하여 내 컴퓨터에서 명령을

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 pvt@192.168.1.133 "~/tools/run_pvt.pl $BUILD_NUMBER"

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


답변

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

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"

답변

기본적으로 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_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

답변

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