Bash

通過 ssh 遠端執行命令來使用別名

  • April 27, 2021
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 $-',單引號阻止了本地擴展。在$-遠端外殼的上下文中未引用。

結果是從遠端shellhBc傳來的。遠端外殼不是互動式的。

2. Bash 試圖變得聰明

關於非互動式外殼採購.bashrc,請參閱我的另一個答案

Twist number 2:Bash 嘗試確定它何時在其標準輸入連接到網路連接的情況下執行,就像由 SSH 伺服器執行時一樣。如果 Bash 確定它正在以這種方式執行,它會從~/.bashrc.

您連結到Bash 文件。我在說的是“由遠端外殼守護程序呼叫”下。還有更多曲折,請參閱完整的連結答案。

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