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にありません。
回避策として、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