Brew가 서버에 설치되어 있지만 서버에 sshpass하면 예외가 발생하고 bash: brew: command not found
ideviceinstaller에서도 마찬가지입니다.bash: ideviceinstaller: command not found
이것이 내가 사용하는 명령입니다
sshpass -p password ssh -oStrictHostKeyChecking=no -oCheckHostIP=no user@**** 'cd /Users/user/Documents/workspace/iOS; brew'
sshpass -p password ssh -oStrictHostKeyChecking=no -oCheckHostIP=no user@**** 'cd /Users/user/Documents/workspace/iOS; ideviceinstaller -l'
나는 똑같은 .bashrc와 .bash_profile을 가지고 있습니다.
[[ -s "$HOME/.profile" ]] && source "$HOME/.profile" # Load the default .profile
[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm" # Load RVM into a shell session *as a function*
export ANDROID_HOME=/Users/user/Library/Android/sdk
export GIT_SSH_COMMAND='ssh -o KexAlgorithms=+diffie-hellman-group1-sha1'
export PATH=$ANDROID_HOME/platform-tools:$ANDROID_HOME/tools:$PATH
# Setting PATH for Python 3.7
# The original version is saved in .bash_profile.pysave
PATH="/Library/Frameworks/Python.framework/Versions/3.7/bin:${PATH}"
export PATH
. 윤곽
# Add RVM to PATH for scripting. Make sure this is the last PATH variable change.
export PATH="$PATH:$HOME/.rvm/bin"
[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm" # Load RVM into a shell session *as a function*
내가 어떤 실수를 했는지 잘 모르겠습니다. 도와주세요
답변1
쉘이 실행하는 로그인 스크립트를 선택하는 조합 ssh
과 매우 비직관적인 방식은 사용자를 혼란스럽게 할 수 있습니다.bash
매뉴얼 페이지 에서 ssh(1)
(강조):
서버가 사용자의 신원을 승인하면 서버는 다음 중 하나를 수행합니다.비대화형 세션에서 주어진 명령을 실행합니다.또는 명령이 지정되지 않은 경우 시스템에 로그인하고 사용자에게 대화형 세션으로 일반 쉘을 제공합니다. [...]
대화형 세션이 요청되면 기본적으로 ssh는 클라이언트에 대화형 세션이 있는 경우에만 대화형 세션에 대한 pty를 요청합니다. [...]
의사 터미널이 할당되지 않은 경우 세션은 투명하며 이진 데이터를 안정적으로 전송하는 데 사용할 수 있습니다.
명시적으로 명시되어 있지는 않지만 원격 측에서 실행할 명령을 지정할 때 ssh
비대화형 세션을 실행하고 있다고 가정하며 -t
옵션을 사용하지 않는 한 원격 측에 의사 터미널(pty)이 할당되지 않습니다. ssh
.
이는 원격 측의 쉘에 중요하다는 것이 밝혀졌습니다.
bash(1)
매뉴얼 페이지 에서 :
ㅏ로그인 쉘인수 0의 첫 번째 문자는 - 이거나 옵션으로 시작합니다
--login
.하나대화형 쉘옵션이 아닌 인수(
-s
지정되지 않는 한)를 취하지 않고-c
표준 입력과 오류가 모두 터미널에 연결되어 있는isatty(3)
옵션 ( 에 의해 결정됨)을 취하지 않거나-i
해당 옵션으로 시작되는 옵션을 취하지 않는 옵션입니다. [...]
(의사) 터미널이 없고 옵션이 아닌 인수 집합으로 실행하는 명령이 있으므로 다음 bash
과 같이 시작하십시오.비대화형 로그인 셸. 그렇다면 이 경우 어떤 스크립트가 실행됩니까?
bash가 대화형 로그인 셸로 호출될 때 또는--login 옵션을 사용하는 비대화형 쉘로, 먼저 파일에서 읽고
/etc/profile
파일이 있으면 명령을 실행합니다. 파일을 읽은 후~/.bash_profile
,~/.bash_login
, 를 순서대로 찾아 존재~/.profile
하고 읽을 수 있는 첫 번째 파일부터 명령을 읽고 실행합니다.
따라서 쉘에 명시적 옵션이 있는지 여부에 따라 실행될 수도 있고 실행되지 않을 수도 /etc/profile
있습니다 .~/.bash_profile
--login
어때요 ~/.bashrc
?
언제대화형 쉘비로그인 쉘을 시작할 때 bash는 /etc/bash.bashrc 및 ~/.bashrc 파일이 존재하는 경우 해당 명령을 읽고 실행합니다.
따라서 ~/.bashrc
대화형 셸에만 적용되며 /etc/bash.bashrc
.
예를 들어 bash가 비대화형으로 시작되면 쉘 스크립트를 실행하기 위해 환경에서 BASH_ENV 변수를 찾고 해당 값이 있으면 확장한 다음 확장된 값을 파일 이름으로 사용하여 읽고 실행합니다. Bash는 다음 명령이 실행된 것처럼 동작합니다.
`if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi`
그러나 PATH 변수의 값은 파일 이름을 검색하는 데 사용되지 않습니다.
따라서 $BASH_ENV
(또는 시스템 기본 환경을 통해 sshd
) 설정하지 않는 한 이는 비정상적일 수 있으므로 가능합니다.로그인 스크립트가 전혀 실행되지 않습니다.비대화형 로그인의 경우.
따라서 비대화형 명령을 실행하면 PATH가 평소보다 훨씬 짧아질 수 있습니다. 다음을 통해 직접 확인할 수 있습니다.
local$ ssh remote
remote$ printenv PATH
/usr/local/sbin:/Users/<username>/perl5/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin
remote$ exit
local$ ssh remote printenv PATH
/usr/bin:/bin:/usr/sbin:/sbin
이 예제는 macOS 10.14.6을 원격 호스트로 사용하여 생성되었습니다. /usr/local/bin
특히 비대화형 세션의 경우 이는 PATH에서 누락되었습니다 .
해결 방법으로 하나 이상의 일반 로그인 스크립트를 명시적으로 가져와야 할 수도 있습니다. 예:
local$ ssh remote "source /etc/profile; printenv PATH"
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/MacGPG2/bin:/opt/X11/bin
경로가 더 좋지만 여전히 대화형 로그인과 완전히 동일하지 않으며 소싱이 ~/.bashrc
도움이 되지 않습니다. 내가 ~/.bashrc
처음에 이것을 가지고 있었기 때문에 그것은 밝혀졌습니다 .
if [ -z "$PS1" ]; then
return
fi
비대화형 쉘에서는 "$PS1"이 설정되지 않습니다. 따라서 이 테스트로 인해 ~/.bashrc
비대화형 세션에서는 전체 테스트가 건너뛰게 됩니다.
출력을 생성하는 로그인 스크립트의 모든 항목~해야 한다이러한 테스트로 캡슐화되거나 SSH 세션을 통해 콘텐츠를 전송하는 것(예:)은 scp
기다리고 있는 애플리케이션 프로토콜 데이터 대신 예상치 못한 스크립트 출력이 발생하여 실패 rsync
할 수 있습니다 .git pull