サーバーに 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にありません。

回避策として、1つ以上の一般的なログインスクリプトを明示的にインポートする必要があるかもしれません。例:

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

おすすめ記事