원격 rsync 프로세스에 환경 변수를 설정하려면 어떻게해야합니까?


12

rsync를 사용하여 한 컴퓨터에서 다른 컴퓨터로 파일을 복사하면 양쪽 끝에서 rsync 프로세스가 시작됩니다. 그러나 원격 쪽에서는 셸 초기화 파일을 읽을 수 없으므로 원격 rsync 프로세스에 대한 환경 변수를 설정할 수 없습니다. 불행히도 rsync가 작동하려면 rsync에 환경 변수가 필요한 서버가 하나 있습니다. 서버 관리자가 아니므로 전역 구성을 변경할 수 없습니다. 원격 rsync 프로세스에 환경 변수를 설정하려면 어떻게해야합니까?


서버에서 rsync 프로세스를 어떻게 시작합니까? ssh를 통해 스크립트를 트리거 할 수 있습니까?
kraftan

그렇게 rsync localfilename remotehost:remotefilename하면 서버에서 rsync 프로세스가 시작됩니다. 정확히 어떻게 모르겠지만 쉘 초기화 파일을 읽지 않습니다.
Ryan C. Thompson

답변:


20

~/.profilessh somecommand대화식 ssh 세션 (또는 대화식 세션을 시작하는 다른 로그인 방법)과 달리 일반적으로 실행시 읽지 않습니다 .

Ssh는 환경 변수 전송을 지원합니다. OpenSSH에서의 SendEnv지시문을 사용하십시오 ~/.ssh/config. 그러나 특정 환경 변수는 서버 구성AcceptEnv 에서 지시문 으로 활성화해야 하므로 제대로 작동하지 않을 수 있습니다.

OpenSSH를 사용하면 서버 측에서 환경 변수를 설정할 수도 있습니다. 여기서도 PermitUserEnvironment지시어 와 함께 서버 구성에서 활성화해야합니다 . 변수는 파일에서 설정할 수 있습니다 ~/.ssh/environment. 공개 키 인증을 사용한다고 가정하면 관련 행의 시작 부분 에 ~/.ssh/authorized_keys: 키를 추가 할 수 있습니다 environment="FOO=bar".

공개 키 인증을 사용하는command= 한 항상 authorized_keys파일 에서 옵션사용하는 것이 이상하게 작동한다고 생각 합니다. command옵션이 있는 키 는 지정된 명령을 실행할 때만 적합합니다. 그러나 authorized_keys파일 의 명령 은 환경 변수 SSH_ORIGINAL_COMMAND가 사용자가 지정한 명령으로 설정되어 실행됩니다 (대화식 세션의 경우 비어 있음). 따라서 다음과 같은 것을 사용할 수 있습니다 ~/.ssh/authorized_keys(물론 인증 에이 키를 사용하지 않으면 적용되지 않습니다).

command="export LD_LIBRARY_PATH=\"$HOME\"/lib;
         if [ -n \"$SSH_ORIGINAL_COMMAND\" ]; then
           eval \"$SSH_ORIGINAL_COMMAND\";
         else exec \"$SHELL\"; fi" ssh-rsa …

가독성을 위해 줄 바꿈을 사용하지만 실제로는 모두 한 줄에 있어야합니다.

또 다른 가능성은 ~/bin/rsync-wrapper서버에 래퍼 스크립트를 작성하는 것입니다.

#!/bin/sh
. ~/.profile
exec rsync "$@"

그런 다음 명령 행을 전달 --rsync-path='bin/rsync-wrapper'하십시오 rsync. 에 대한 인수 --rsync-path는 쉘에 의해 확장되므로 원하는 경우 rsync 명령 행을 다음과 같이 전달하여 자체 포함시킬 수 있습니다 --rsync-path='. ~/.profile; rsync'.

로그인 쉘이 bash 또는 zsh인지에 따라 다른 방법이 있습니다. Bash ~/.bashrc는 rshd 또는 sshd에 의해 호출 될 때 항상 대화식이 아니더라도 (로 호출되지는 않더라도) 읽습니다 sh. Zsh는 항상 읽습니다 ~/.zshenv.

## ~/.bashrc
if [[ $- != *i* ]]; then
  # Either .bashrc was sourced explicitly, or this is an rsh/ssh session.
  . ~/.profile
fi

## ~/.zshenv
if [[ $(ps -p $PPID -o comm=) = [rs]shd && $- != *l* ]]; then
  # Not a login shell, but this is an rsh/ssh session
  . ~/.profile
fi

글쎄, 그것은 거의 요약합니다. 래퍼 스크립트를 사용하는 것보다 더 나은 방법이 있기를 바랍니다.
라이언 C. 톰슨

그러나 잠시만 기다리십시오. 쉘 초기화 파일을 읽지 못하면 서버에서 rsync 바이너리를 어떻게 찾을 수 있습니까? $PATH쉘 init 스크립트에 추가 해야하는 비표준 위치 인 ~ / usr에 설치했습니다 .
Ryan C. Thompson

@Ryan : 실제로 가장 직접적인 방법을 잊어 버렸지 만 (내 편집 참조) 서버 구성에서 지시문을 활성화해야합니다. PATH고려할 방법을 찾은 경우 다른 변수를 설정할 수 있어야합니다. (작동하지 않으면 set -x쉘 스크립트 부터 시작하여 가능한 한 많은 추적을 추가 rsync하십시오. 환경에 파일을 덤프 한 래퍼 스크립트로 바이너리를 바꾸고 실제 바이너리를 호출하십시오.)
Gilles 'SO -악의를 멈춰라

무엇에 대해 ~/.ssh/rc?
라이언 C. 톰슨

@Ryan : ~/.ssh/rc별도의 쉘 프로세스에 의해 실행됩니다. 가장 좋은 방법은 래퍼 스크립트 또는 --rsync-path='. ~/.profile; rsync'입니다. 또는 rsync다른 질문에 따라 적절한 rpath로 다시 컴파일 하십시오.
Gilles 'SO- 악마 중지'11
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.