Shell
為什麼某些命令在使用 ssh 執行時不載入使用者環境?(而其他人這樣做)
在目標機器(OS X El Capitan)上,我
brew
有/usr/local/bin
. 當我嘗試獲取 brew 的路徑時,我沒有得到任何結果:# ssh vagrant@127.0.0.1 -p 2222 which brew #
故障排除:
brew
存在/usr/local/bin/
並通過以下方式正確執行ssh
:# ssh vagrant@127.0.0.1 -p 2222 ls -l /usr/local/bin/brew -rwxr-xr-x 1 vagrant admin 656 Mar 20 10:05 /usr/local/bin/brew # ssh vagrant@127.0.0.1 -p 2222 /usr/local/bin/brew --version Homebrew 0.9.5 (git revision 3a41; last commit 2016-03-20)
/usr/local/bin
路徑中有:# ssh vagrant@127.0.0.1 -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 vagrant@127.0.0.1 -p 2222 which bash /bin/bash
- 此外,當以互動方式登錄到機器時,我得到了預期的結果:
# ssh vagrant@127.0.0.1 -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 vagrant@127.0.0.1 -p 2222 echo $(which brew) /usr/local/bin/brew
- 呼叫
echo
beforewhich brew
會導致它給出正確的結果:# ssh vagrant@127.0.0.1 -p 2222 echo test ; which brew test /usr/local/bin/brew
- 顯式呼叫 shell 來執行
which brew
並不會改變這種情況:# ssh vagrant@127.0.0.1 -p 2222 /bin/sh -c "which\ brew" # ssh vagrant@127.0.0.1 -p 2222 /bin/sh -c "which\ which" /usr/bin/which
但是,從(6)中明確呼叫
/bin/sh
“技巧”不再有效:# ssh vagrant@127.0.0.1 -p 2222 /bin/sh -c "echo\ test\ \;\ which\ brew" test #
為什麼
which brew
直接作為 ssh 命令參數執行會失敗?為什麼
echo
哪個外部命令/bin/echo
正確PATH
,而which
沒有?為什麼順序執行兩個命令會導致第二個使用第一個的環境?是否可以確保在不參考 (6) 中的未記錄(我認為)解決方法的情況下載入環境?
ssh vagrant@127.0.0.1 -p 2222 echo $PATH
您的本地系統
PATH
將在此處列印。您應該引用該變數以防止它被本地 shell 擴展:ssh vagrant@127.0.0.1 -p 2222 'echo $PATH'
這同樣適用於:
ssh vagrant@127.0.0.1 -p 2222 echo $(which brew)
至於:
ssh vagrant@127.0.0.1 -p 2222 echo test ; which brew
which brew
在 SSH 命令結束後由本地 shell 執行。這就是為什麼這不起作用:ssh vagrant@127.0.0.1 -p 2222 /bin/sh -c "echo\ test\ \;\ which\ brew"
旁注:你不需要做所有的轉義。
這裡的問題可能是您正在添加
brew
到您的PATH
in.profile
(.bash_profile
或一些類似的文件)中,該文件在登錄 shell啟動時執行。SSH 僅在互動執行時才啟動登錄 shell,而不是在被告知執行命令時。來自man ssh
:If command is specified, it is executed on the remote host instead of a login shell
你可以試試:
ssh vagrant@127.0.0.1 -p 2222 bash -lc brew