Shell

為什麼某些命令在使用 ssh 執行時不載入使用者環境?(而其他人這樣做)

  • March 21, 2016

在目標機器(OS X El Capitan)上,我brew/usr/local/bin. 當我嘗試獲取 brew 的路徑時,我沒有得到任何結果:

# ssh vagrant@127.0.0.1 -p 2222 which brew
#

故障排除:

  1. 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)
  1. /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
  1. which本身似乎沒有問題:
# ssh vagrant@127.0.0.1 -p 2222 which bash
/bin/bash
  1. 此外,當以互動方式登錄到機器時,我得到了預期的結果:
# 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
  1. 最後which brew在命令替換錶達式中起作用:
# ssh vagrant@127.0.0.1 -p 2222 echo $(which brew)
/usr/local/bin/brew
  1. 呼叫echobeforewhich brew會導致它給出正確的結果:
# ssh vagrant@127.0.0.1 -p 2222 echo test ; which brew
test
/usr/local/bin/brew
  1. 顯式呼叫 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到您的PATHin .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

引用自:https://unix.stackexchange.com/questions/271171