如何繞過 ssh_config 中的 RemoteCommand 選項
我已經定義了一個
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,有兩種明智的解決方案:
- 在伺服器上,編輯您的
.profile
或類似的登錄時腳本(.zprofile
、、、.config/fish/config.ish
….login
)以在互動登錄時執行 tmux。請參閱例如如何在通過 SSH 連接後立即執行腳本?,在 ssh 登錄時執行 tmux。- 在客戶端上,定義一個
ssh
執行 tmux 的包裝器。例如一個shell函式: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)。