Ssh

如何繞過 ssh_config 中的 RemoteCommand 選項

  • January 13, 2021

我已經定義了一個ssh_config文件,其中包含我定期連接的所有主機。我喜歡在連接到主機時啟動/連接到 tmux 會話,所以我RemoteCommand tmux new -ADs remote在我的配置中添加了該行。問題是,如果在某些時候我想在 ssh 上使用 rsync(我不時這樣做),我會遇到以下錯誤:

Cannot execute command-line and remote command.

為了解決它,我必須RemoteCommand在我的配置文件中註釋掉該行,然後不要忘記取消註釋它,這有點煩人……

潛在的解決方案(不受歡迎或不起作用):

  • 我嘗試使用-N表示“不執行遠端命令”的標誌,但該命令無限期掛起。
  • 我不希望在我的配置文件中創建別名主機,因為這意味著條目數量將增加 2 倍,只需進行一次小的更改。
  • 不使用 rsync 時,我無法使用Match Host僅執行遠端命令

任何人都知道在這種情況下可能對我有幫助的配置技巧或解決方法嗎?

非常感謝!

不要放入RemoteCommand配置文件。有時,為執行特定命令RemoteCommand的主機定義別名很有用。ssh myalias它在通用條目中沒有用。正如您所注意到的,它會阻止執行除執行特定命令之外的任何操作:您不能使用 rsync、sftp、sshfs,甚至不能ssh myhost specific-command互動執行。

如果您想在連接到主機時預設執行 tmux,有兩種明智的解決方案:

tsh () {
 ssh "$@" tmux new -ADs remote
}

Match host指令無濟於事,因為您對根據主機名做不同的事情不感興趣。我認為 ssh 客戶端沒有辦法根據命令是否傳遞給 ssh 來做不同的事情。您可以使用Match exec. 我認為沒有一種干淨的方法可以檢測是否使用命令呼叫了 ssh,但是一種骯髒的方法可能對您來說已經足夠了。

Host myhost
Match exec "ps -o args= $PPID | grep -v ' .* '"
   RemoteCommand if [ -t 0 ]; then exec tmux new -ADs remote; fi

如果ssh僅使用主機名且沒有選項呼叫,則執行 tmux。如果ssh使用至少一個選項或除主機名之外的命令呼叫,RemoteCommand則不應用該指令。echo ls | ssh myhost如果輸入不是來自終端(例如),也不要執行 tmux 。這應該處理大多數情況,在不執行 tmux 方面犯錯(例如ssh -L … myhost不會執行 tmux)。

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