ssh 명령을 통해 환경 변수를 전달하려면 어떻게해야합니까? [복제]


42

호스트 시스템에서 시작된 환경이 내가 선택한 특정 환경 변수로 시작하도록 ssh 명령에 값을 전달하려면 어떻게해야합니까?

편집 : 목표는 현재 kde 데스크탑 (dcop kwin KWinInterface currentDesktop)을 새로운 쉘로 전달 하여 각 KDE 데스크탑마다 고유 한 원래 서버의 JEdit 인스턴스 로 nfs 위치를 다시 전달할 수 있도록하는 것 입니다. ( emacsserver / emacsclient 와 같은 메커니즘 사용 )

여러 ssh 인스턴스가 한 번에 비행 할 수있는 이유는 환경을 설정할 때 다른 ssh 인스턴스를 다른 시스템에 열어 놓기 때문입니다.

답변:


17

~/.ssh/environment파일은 원격 명령에 사용할 원하는 설정 변수를 사용할 수 있습니다. PermitUserEnvironmentsshd 구성에서 활성화해야 합니다.

이 방법으로 설정된 변수는 하위 프로세스로 내보내 지므로 다음을 수행 할 수 있습니다.

echo "Foo=Bar" > sshenv
echo "Joe=37" >> sshenv
scp sshenv user@server:~/.ssh/environment
ssh user@server myscript

그리고 myscript는 Foo가 Bar이고 Joe가 37이라는 것을 알게 될 것입니다.


3
변수는 잠재적으로 모든 ssh를 호출 변경해야
로스 로저스

1
무엇을하려고하는지, 왜 그런지 설명하는 것이 좋습니다. 다른 해결책이있을 수 있습니다. 환경 파일은 각 ssh 호출에서 동적으로 생성되어야하지만 불가능하지는 않습니다.
EmmEff

무엇을 바꿀까요? 해당 변수의 값 또는 이름?
innaM

꿰매다. 이 솔루션을 시도했지만 sshd 구성 파일에 액세스 할 수 없으며 ~ / .ssh / environment 또는 ~ / .ssh2 / environment에 vars를 넣을 수 없습니다. 나는이 변수를 nfs 디스크에 남겨두고 ~ / .tcsh 설정 파일로 스너프하는 kludge를 사용할 것이라고 생각합니다.
Ross Rogers

2
이 답변은 실제로 질문에 대답하지 않는 것 같습니다.
직관

55

SendEnv옵션은 사람이다.

~ / .ssh / config : (로컬로)

SendEnv MYVAR

/ etc / ssh / sshd_config : (원격 끝)

AcceptEnv MYVAR

이제 $MYVAR로컬 값이 무엇이든 원격 세션에서도 사용할 수 있습니다.
여러 번 로그인하면 각 세션 $MYVAR마다 값이 다른 고유 한 사본이 있습니다.

~/.ssh/environment다른 목적으로 사용됩니다. 쉘이 아닌 명령을 원격으로 $ENV실행할 때 파일 의 역할을 합니다 .


6
명령 줄을 통해 (보다 유용하게) 전달할 ssh myserver -o SendEnv="MYVAR"수 있으므로 스크립트에서 동적으로 만들 수 있습니다.
Mike Campbell

30

다음과 유사한 명령으로 값을 전달할 수 있습니다.

ssh username@machine VAR=value cmd cmdargs

다음과 같이 테스트 할 수 있습니다.

ssh machine VAR=hello env

tcsh에서 다음이 작동하는 것 같습니다.

ssh machine "setenv VAR <value>; printenv"

bash 환경에서 잘 작동하는 것 같습니다. 회사 tcsh 환경에 있습니다.
Ross Rogers

2
세션을 대화식으로 사용하려면 어떻게해야합니까?
luckydonald

1
첫 번째 예제는 명령을 함께 연결하는 경우 첫 번째 명령에 대해서만 작동합니다 &&. export VAR=value;세 번째 형식의 setenv 대신 bash를 사용하면 이 경우 작동합니다.
contrebis

2
이것이 내가 결국 한 일입니다! 당신이 어디를 가든 당신과 함께 환경을 가져 가라. 당신은 그렇게 할 수 있습니다 : ssh user@host "$(<env_to_source.sh) command ..." . env에서, 나는 export var=value ; 별도의 줄에 있습니다 (세미콜론을 기억하십시오).
Tomasz Gandor

@TomaszGandor : 몇 년이 지난 지금도 완벽합니다-PROMPT_COMMAND와 같은 복잡한 것을 전달할 수 있습니다.
빨간 약

29

끔찍하고 끔찍한 해킹도 있습니다.

스크립트가 원격 끝에서 변수를 사용하는 경우 (예 : 원하는 이름을 지정할 수 있음) 로캘 변수를 남용 할 수 있습니다. LC_ * 형식의 모든 변수는 구성 할 필요없이 그대로 전달됩니다.

예를 들어 클라이언트 중 하나에 일련의 요새 서버가 있습니다. 매번 다른 서버와 다른 서버에 연결하기 만하면 연결이 싫습니다. 나는 똑똑한 것을 제외하고 SSH처럼 행동하는 스크립트를 가지고 있습니다.

기본적으로 LC_BOUNCE_HOSTS가 설정되어 있으면 LC_BOUNCE_HOSTS가 공백으로 분할되고 첫 번째 호스트가 벗겨집니다. 그런 다음 동일한 스크립트를 반송하고 실행합니다. 대상 노드에서이 목록은 결국 비어 있으므로 명령을 실행합니다. LC_BOUNCE_DEBUG에 의해 설정된 디버그 모드 (네트워크 문제가 발생했을 때 좋습니다)가 있습니다. ssh는이 모든 것을 마술처럼 전달하기 때문에 호스트 목록의 끝을 인식하는 것 이외의 다른 작업을 수행 할 필요가 없습니다 (-옵션으로 수행).

이것을 사용할 때마다 더러워 지지만 시도한 모든 곳에서 작동합니다.


2
OpenSSH의 내장 ProxyCommand옵션 대신 왜 그런 것을 사용 하시겠습니까? 편집 ~/.ssh/config하고 블록을 추가 Host *.example.com: ProxyCommand -ssh -W %h:%p bastionhost하여 연결을 터널링하십시오.
Kirk Strauser

1
터널의 경우 그렇게 나쁘지 않습니다. 환경 변수의 경우 두 가지 이유가 있습니다. 하나, PermitUserEnvironment는 서버에 직접 전달하기 위해 관리자 액세스 권한을 서버에 구성해야합니다. 커맨드 라인을 통해 전달하는 것도 탈출하기가 정말 어렵습니다. 두 개, 여러 개의 요새가 바운스되어야하는데, 특히 소스 호스트에서 특정 목적지 호스트로가는 경로가 명확하지 않은 경우에는 좀 더 복잡합니다. "bounce-ssh bast1 bast2 nodeX-rm -rf /"는 일련의 ssh-config 파일에서 진화하는 호스트 모집단의 경로를 유지하는 것보다 쉽습니다.
Jayson

잘 잡아라! 너무 훌륭하고 조금 더러워 요!
zw963

2
이것은 끔찍하다. 브라보. 👏
Pi Delport

1
고마워요! 나는 하나 더 끔찍한 멋진 해킹에 사용했습니다 ! :)
lumbric

1
bla="MyEnvSelection=dcop"
ssh user@host "export $bla && ./runProg"

bash에서 나는 다음과 같이 테스트했다.

$ echo '#!/bin/sh' > readEnv.sh
$ echo 'echo "MyEnv: "$MyEnvFromSSH' >> readEnv.sh

$ scp readEnv.sh user@host:~/
$ bla="MyEnvFromSSH=qwert"
$ ssh user@host "export $bla && ./readEnv.sh"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.