SSH를 사용하여 실행할 때 일부 명령이 사용자 환경을 로드하지 않는 이유는 무엇입니까? (다른 사람들이 하는 동안)

SSH를 사용하여 실행할 때 일부 명령이 사용자 환경을 로드하지 않는 이유는 무엇입니까? (다른 사람들이 하는 동안)

대상 컴퓨터(OS X El Capitan)에 추출할 경로를 얻으려고 하면 결과가 없습니다 brew./usr/local/bin

# ssh [email protected] -p 2222 which brew
#

문제 해결:

  1. brew/usr/local/bin/다음 방법으로 올바르게 수행하십시오 ssh.

    # ssh [email protected] -p 2222 ls -l /usr/local/bin/brew
    -rwxr-xr-x  1 vagrant  admin  656 Mar 20 10:05 /usr/local/bin/brew
    # ssh [email protected] -p 2222 /usr/local/bin/brew --version
    Homebrew 0.9.5 (git revision 3a41; last commit 2016-03-20)
    
  2. /usr/local/bin경로에는 다음이 포함됩니다.

    # ssh [email protected] -p 2222 echo $PATH
    /usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/opt/local/bin:/opt/local/sbin
    
  3. which그 자체로는 문제가 없는 것 같습니다.

    # ssh [email protected] -p 2222 which bash
    /bin/bash
    
  4. 또한 머신에 대화형으로 로그인할 때 예상되는 결과를 얻었습니다.

    # ssh [email protected] -p 2222
    Last login: Sun Mar 20 12:02:55 2016 from 10.0.2.2
    osx-pf:~ vagrant$ which brew
    /usr/local/bin/brew
    
  5. 마지막으로 which brew명령 대체 표현에서 작동합니다.

    # ssh [email protected] -p 2222 echo $(which brew)
    /usr/local/bin/brew
    
  6. echo이전에 호출하면 which brew올바른 결과가 제공됩니다.

    # ssh [email protected] -p 2222 echo test ; which brew
    test
    /usr/local/bin/brew
    
  7. 실행할 셸을 명시적으로 호출해도 which brew이 상황은 바뀌지 않습니다.

    # ssh [email protected] -p 2222 /bin/sh -c "which\ brew"
    # ssh [email protected] -p 2222 /bin/sh -c "which\ which"
    /usr/bin/which
    

    그러나 /bin/sh(6)의 "트릭"을 명시적으로 호출하는 것은 더 이상 작동하지 않습니다.

    # ssh [email protected] -p 2222 /bin/sh -c "echo\ test\ \;\ which\ brew"
    test
    #
    

which brewSSH 명령 매개변수로 직접 실행하면 실패하는 이유는 무엇 입니까?

echo어떤 외부 명령이 /bin/echo올바르게 표시되지만 PATH표시 되지 않는 이유는 무엇입니까 which? 두 명령을 차례로 실행하면 두 번째 명령이 첫 번째 명령의 환경을 사용하게 되는 이유는 무엇입니까?

(6)의 문서화되지 않은 해결 방법을 참조하지 않고 환경이 로드되었는지 확인하는 것이 가능합니까?

답변1

ssh [email protected] -p 2222 echo $PATH

로컬 시스템이 PATH여기에서 인쇄됩니다. 로컬 셸에서 변수가 확장되는 것을 방지하려면 변수를 인용해야 합니다.

ssh [email protected] -p 2222 'echo $PATH'

다음에도 동일하게 적용됩니다.

ssh [email protected] -p 2222 echo $(which brew)

에 관해서는:

ssh [email protected] -p 2222 echo test ; which brew

which brewSSH 명령이 끝난 후 로컬 셸에서 실행합니다. 이것이 작동하지 않는 이유는 다음과 같습니다.

ssh [email protected] -p 2222 /bin/sh -c "echo\ test\ \;\ which\ brew"

참고 사항: 모든 탈출 작업을 수행할 필요는 없습니다.


여기서 문제는 다음과 같은 in (또는 유사한 파일) brew에 추가하는 것일 수 있습니다.PATH.profile.bash_profile로그인 쉘시작되었습니다. SSH는 명령을 실행하라는 지시가 아닌 대화형으로 실행될 때만 로그인 셸을 시작합니다. ~에서man ssh:

 If command is specified, it is executed on the remote host instead of a login shell

당신은 시도 할 수 있습니다:

ssh [email protected] -p 2222 bash -lc brew

답변2

ssh에서 직접 명령을 실행하면 "로그인"하는 것이 아니라 명령을 실행하는 것뿐입니다.

일부 쉘 스크립트는 "로그인"할 때 실행됩니다 - ~/.bashrc, /etc/profile 등.

which특히 환경 변수 사용은 $PATH이러한 스크립트 중 하나에서 설정할 수 있습니다. 그것 없이는 $PATH어디 which를 봐야할지 알 수 없습니다.

또한 기대하는 바를 제공하지 않습니다. 이는 ssh에 도달하기 전에 쉘에 의해 해석됩니다. 다음과 비교하십시오(쉘 확장 주위의 작은따옴표 참고). 첫 번째는 로컬 호스트 이름을 가져와서 에코를 위해 원격 호스트로 보냅니다. 두 번째는 (문자 그대로) 원격 셸로 전송되어 확장됩니다.ssh [email protected] -p 2222 echo $(which brew)$(which brew)ssh [email protected] -p 2222 echo $(hostname)ssh [email protected] -p 2222 echo '$(hostname)'$(hostname)

업데이트: 나는 이것에 대해 약간 틀렸습니다.

ssh를 통해 명령을 실행하면 ssh는 쉘이 필요한지 여부를 결정합니다(예: 변수 계산 등). 필요하지 않은 경우 바이너리를 즉시 실행하세요. 그렇지 않으면 환경 변수 등을 설정할 수 있는 bash를 실행하세요.

그렇기 때문에 (귀하의 의견에서) Brew --version이 실패합니다. 경로를 언급하지 않았습니다. echo...; brew --version세미콜론은 ;특수 쉘 문자 입니다 . ssh는 bash를 실행하여 이를 처리합니다.

관련 정보