Linux

ssh foo '<command/>' 不載入遠端別名?

  • June 5, 2015

摘要:為什麼會失敗

$ ssh foo 'R --version | head -n 1'
bash: R: command not found

但這成功了

$ ssh foo 'grep -nHe 'bashrc' ~/.bash_profile'
/home/me/.bash_profile:3:# source the users .bashrc if it exists
/home/me/.bash_profile:4:if [ -f "${HOME}/.bashrc" ] ; then
/home/me/.bash_profile:5:  source "${HOME}/.bashrc"
$ ssh foo 'grep -nHe "\WR\W" ~/.bashrc'
/home/me/.bashrc:118:alias R='/share/linux86_64/bin/R'
$ ssh foo '/share/linux86_64/bin/R --version | head -n 1'
R version 2.14.1 (2011-12-22)

? 細節:

我是 2 個集群上的(無根)使用者。一個使用環境模組,因此該集群上的任何給定伺服器都可以(通過module add)提供幾乎相同的資源。不幸的是,我也必須在另一個集群上工作,它有單獨管理的伺服器,所以我養成了這樣做的習慣,例如,

EXEC_NAME='whatever'
for S in 'foo' 'bar' 'baz' ; do
 ssh ${SERVER} "${EXEC_NAME} --version"
done

這適用於正常/一致安裝的軟體包,但通常(由於我不知道的原因)軟體包不是:例如(將下面的別名與上面的別名進行比較),

$ ssh bar 'R --version | head -n 1'
bash: R: command not found
$ ssh bar 'grep -nHe 'bashrc' ~/.bash_profile'
/home/me/.bash_profile:3:# source the users .bashrc if it exists
/home/me/.bash_profile:4:if [ -f "${HOME}/.bashrc" ] ; then
/home/me/.bash_profile:5:  source "${HOME}/.bashrc"
$ ssh bar 'grep -nHe "\WR\W" ~/.bashrc'
/home/me/.bashrc:118:alias R='/share/linux/bin/R'
$ ssh bar '/share/linux86_64/bin/R --version | head -n 1'
R version 2.14.1 (2011-12-22)

當我以互動方式進入伺服器時,使用別名可以很好地應對這些安裝差異,但是當我嘗試編寫 ssh 命令腳本時(如上)失敗;IE,

# interactively
$ ssh foo
...
foo> R --version

R在遠端 host= 上呼叫我的別名foo,但是

# scripting
$ ssh foo 'R --version'

沒有。我需要做什麼才能ssh foo "<command/>"在遠端主機上傳入我的別名?

bash手冊頁:

當 shell 不是互動式時,別名不會展開,除非 expand_aliases shell 選項使用 shopt 設置(參見下面 SHELL BUILTIN COMMANDS 下的 shopt 描述)。

您需要shopt -s expand_aliases在您的 remote 中.bashrc,並檢查 .bashrc在非互動式時是否處理了這些;您的發行版的預設設置.bashrc可能包括在非互動式時提前終止的檢查,例如 Ubuntu 使用:

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

引用自:https://serverfault.com/questions/424027