배경

배경

원격 SSH 명령을 실행하고 항상 로드되도록 하고 싶습니다.서비스 터미널기본 시작 파일. 해결책을 찾고 있어요확실히필요하다:

  • 루트로 구성됨
  • 매번 명령에 상용구를 추가하세요.
  • 여러 파일에 환경 변수 복사

그래요아니요로컬 환경 변수를 원격 셸로 전송하고 싶습니다. ssh <host> <command>일반 구문을 사용하여 원격 명령을 실행하고 싶습니다.원격 로그인 세션은 동일한 환경을 갖습니다..

배경

단순화를 위해 다음은 다음을 bash사용한다고 가정합니다.

기본적으로 원격 ssh 명령은 비대화형, 비로그인 셸을 시작합니다. 매뉴얼 페이지를 인용하면 다음과 같습니다.

만약에주문하다지정되면 로그인 쉘이 아닌 원격 호스트에서 실행됩니다.

다음을 실행하여 셸에서 이를 더 명확하게 볼 수 있습니다.

# the lack of 'i' indicates non-interactive
$ ssh localhost 'echo $-'
hBc 

$ ssh localhost 'shopt login_shell'
login_shell     off

하지만 원격 명령에 특정 환경 변수 설정이 필요한 경우에는 어떻게 될까요? 비대화형, 비로그인 쉘이라는 것은어느 것도 아니다 .bash_profile.bashrc구매도 되지 않습니다 .

예를 들어 다음과 같은 도구를 사용하는 경우 문제가 됩니다.페르부루또는가상 환경원격 명령에서 사용자 정의 인터프리터를 사용하고 싶습니다.

$ which perl
/home/calid/perl5/perlbrew/perls/perl-5.20.1/bin/perl

$ ssh localhost 'which perl'
/usr/bin/perl

위 요구 사항을 충족하지 않는 솔루션

원격 명령에서 로그인 셸을 명시적으로 호출합니다.

$ ssh localhost 'bash --login -c "which perl"'

매번 추가 상용구가 필요함

명령 전에 구성 파일을 명시적으로 가져옵니다.

$ ssh localhost 'source ~/.bash_profile && which perl'

매번 추가 상용구가 필요함

환경 변수 설정~/.ssh/environment

서버에서 이 기능을 활성화하려면 루트가 필요합니다.

서버 시작 파일에 이미 중복된 환경 변수가 설정되어 있습니다.

설정 ENVBASH_ENV

작동하지 않습니다. .bash_profile소스 .bashrc가 없습니다 .

설정이 ~/.ssh/environment작동하지만 활성화하려면 루트 액세스가 필요합니다.

필요한 환경 변수를 명령 앞에 붙입니다.

매번 추가 상용구가 필요합니다(아마도 많이).

서버 시작 파일에 이미 중복된 환경 변수가 설정되어 있습니다.

관련 기사

https://stackoverflow.com/questions/415403/whats-the-difference-Between-bashrc-bash-profile-and-environment

https://stackoverflow.com/questions/216202/why-does-an-ssh-remote-command-get-fewer-environment-variables-then-when-run-man#216204

SSH를 통해 명령을 실행할 때 도트 파일을 가져오지 않습니다.

답변1

sshc상용구 코드 앞에 붙는 래퍼 셸 함수를 만듭니다 .source ~/.bash_profile

function sshc {
    local host=$1
    local cmd=$2

    ssh $host "source ~/.bash_profile && $cmd"
}

그런 다음 다음과 같이 사용할 수 있습니다.

$ sshc localhost 'which perl'
/home/calid/perl5/perlbrew/perls/perl-5.20.1/bin/perl

답변2

bash~/.bashrc적어도 데비안과 그 파생물에서는 비대화식으로 호출될 때에도 읽습니다 ssh( #define SSH_SOURCE_BASHRC제 생각에는 버그 기능이지만 여기서는 편리합니다).

~/.bashrc따라서 원격 호스트 상단에 다음을 추가할 수 있습니다.

if [ -n "$SSH_CLIENT" ] &&
   [ "$SHLVL" = 0 ] &&
   [ -n "${-##*[il]*}" ]; then
   . /etc/profile
   . ~/.bash_profile
fi

관련 정보