通過 ssh 遠端執行命令來使用別名
shopt -s expand_aliases ttmp="SUCCESS" alias aliased_command='echo $ttmp'
我可以通過將上述行添加到 .bashrc 文件來遠端使用別名。
[USER@REMOTESERVER ~]$ ssh MYSERVER aliased_command SUCCESS
除非使用 shopt 設置了 expand_aliases shell 選項,否則當 shell 不是互動式時,別名不會展開
expand_aliases
選項允許非互動式 shell 使用別名。但是,當我執行時:
[USER@REMOTESERVER ~]$ ssh MYSERVER echo $- himBH
似乎通過 ssh 執行遠端命令正在使用互動式 shell。(
i
包含)這是正確的嗎?
如果正確,為什麼需要 expand_aliases 選項?
如果錯誤,如果
ssh SERVER COMMAND
使用非互動式 shell,為什麼非互動式 shell 不ssh MYSERVER COMMAND
讀取.bashrc
文件時讀取 MYSERVER的.bashrc
文件?cf) 引用命令導致不同的輸出
[USER@REMOTESERVER ~]$ ssh MYSERVER 'echo $-' hBc
任何連結,評論表示讚賞。
至少有兩個方面:
1. 報價
Unquoted
$-
由您的本地shell 擴展。請注意,本地ssh
可以從它獲得的多個參數建構 shell 程式碼(在遠端端執行)。當你這樣做時ssh MYSERVER echo $-
,遠端 shell 得到了echo himBH
. 該himBH
字元串來自您的本地外殼。當你這樣做時ssh MYSERVER 'echo $-'
,遠端 shell 得到了echo $-
.請參閱如何通過 ssh 執行複雜的命令行以及我的答案。我不會在這裡重複所有內容。最重要的事情:
要控制遠端 shell 將獲得什麼
$command_line_built_by_ssh
,您需要理解、預測和策劃之前發生的解析和解釋。你需要製作你的本地命令,所以在本地 shell 並ssh
消化它之後,它就變成了$command_line…
你想要在遠端端執行的確切命令。一個好的方法是將精確(遠端)命令
ssh
作為單個參數傳遞給本地。這就是您所做的ssh MYSERVER 'echo $-'
,單引號阻止了本地擴展。在$-
遠端外殼的上下文中未引用。結果是從遠端shell
hBc
傳來的。遠端外殼不是互動式的。2. Bash 試圖變得聰明
關於非互動式外殼採購
.bashrc
,請參閱我的另一個答案:Twist number 2:Bash 嘗試確定它何時在其標準輸入連接到網路連接的情況下執行,就像由 SSH 伺服器執行時一樣。如果 Bash 確定它正在以這種方式執行,它會從
~/.bashrc
.您連結到Bash 文件。我在說的是“由遠端外殼守護程序呼叫”下。還有更多曲折,請參閱完整的連結答案。