대상 컴퓨터(OS X El Capitan)에 추출할 경로를 얻으려고 하면 결과가 없습니다 brew
./usr/local/bin
# ssh [email protected] -p 2222 which brew
#
문제 해결:
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)
/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
which
그 자체로는 문제가 없는 것 같습니다.# ssh [email protected] -p 2222 which bash /bin/bash
또한 머신에 대화형으로 로그인할 때 예상되는 결과를 얻었습니다.
# 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
마지막으로
which brew
명령 대체 표현에서 작동합니다.# ssh [email protected] -p 2222 echo $(which brew) /usr/local/bin/brew
echo
이전에 호출하면which brew
올바른 결과가 제공됩니다.# ssh [email protected] -p 2222 echo test ; which brew test /usr/local/bin/brew
실행할 셸을 명시적으로 호출해도
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 brew
SSH 명령 매개변수로 직접 실행하면 실패하는 이유는 무엇 입니까?
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 brew
SSH 명령이 끝난 후 로컬 셸에서 실행합니다. 이것이 작동하지 않는 이유는 다음과 같습니다.
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를 실행하여 이를 처리합니다.