Ssh
在遠端伺服器上通過 ssh 執行本地別名
我知道我可以通過 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。