서버에 sshpass할 때 Brew를 찾을 수 없습니다

서버에 sshpass할 때 Brew를 찾을 수 없습니다

Brew가 서버에 설치되어 있지만 서버에 sshpass하면 예외가 발생하고 bash: brew: command not foundideviceinstaller에서도 마찬가지입니다.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

관련 정보