Ssh

在遠端伺服器上通過 ssh 執行本地別名

  • May 14, 2017

我知道我可以通過 SSH 在遠端伺服器上執行一個功能,如下所示:

$ ssh remote_server "$(declare -f cool_function); cool_function"

我還有一些別名,我想在遠端伺服器上執行,而不必在遠端伺服器上的任何文件上定義它們,因此我可以將所有功能和別名放在一個地方,並在任何遠端 SSH 伺服器上使用它們。

我認為這會起作用:

$ alias very_cool_alias='echo A very cool alias'
$ very_cool_alias
A very cool alias
$ ssh remote_server "$(alias very_cool_alias);very_cool_alias"
bash: very_cool_alias: command not found

雖然如果我檢查別名,別名就在那裡:

$ ssh remote_server "$(alias very_cool_alias);alias"
alias very_cool_alias='echo A very cool alias'

為什麼函式有效但別名無效,儘管它被傳遞到遠端 SSH 伺服器,如上一個範例所證明的那樣?關於我缺少什麼或如何實現這一點的任何想法?

我也嘗試設置 expand_aliases 選項,但仍然得到command not found

ssh remote_server "shopt -s expand_aliases;$(alias some_alias);some_alias"    

Shell手冊 告訴我們:

當 shell 不是互動式時,別名不會展開,除非 expand_aliases shell 選項使用shopt

然而它也提到

關於別名的定義和使用的規則有些混亂。在執行該行的任何命令之前,Bash 總是讀取至少一個完整的輸入行。別名在讀取命令時擴展,而不是在執行命令時擴展。

這可以在本地測試:(ssh 正在bash -c遠端呼叫):

$ bash -c "shopt -s expand_aliases; shopt expand_aliases;alias x=ls; x"
expand_aliases  on
bash: x: command not found

它確實有助於使其成為多行:

$ bash -c "shopt -s expand_aliases; alias x='echo y'
> x"
y

這也適用於 ssh。

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