使用特定於主機的聲明更改 ssh ControlPath
我有一種情況,我需要使用兩個不同的 SSH 密鑰訪問同一個 SSH 主機(GitHub)。這沒問題,我可以通過給主機名起別名來輕鬆設置它。當此配置與我的 SSH 多路復用配置結合使用時,就會出現問題。我似乎無法使用特定於主機的聲明覆蓋我的預設 ControlPath。
也許這就是它的工作方式?也許這是一個錯誤?難道我做錯了什麼?
順便說一句,我在 Mac 10.7 上。
這是我的配置:
Host * ControlMaster auto ControlPath ~/.ssh/connections/ssh-%r@%h:%p Host github.com-X TCPKeepAlive yes ServerAliveInterval 60 ControlPersist 1h Hostname github.com User git IdentityFile ~/.ssh/id_rsa_X IdentitiesOnly yes ControlPath ~/.ssh/connections/ssh-%r@%h-X:%p Host github.com TCPKeepAlive yes ServerAliveInterval 60 ControlPersist 1h
我已經修改了一點,但似乎我總是得到 Host * 聲明中指定的 ControlPath。
ssh -T git@github.com-X
使用 id_rsa_X 將我作為正確的使用者登錄,但它會在此處創建域套接字:
~/.ssh/connections/ssh-git@github.com:22
而不是:
~/.ssh/connections/ssh-git@github.com-X:22
所以後來當我嘗試使用 id_rsa 發出 SSH 命令時,由於連接多路復用,我得到了 id_rsa_X 使用者。換句話說:
ssh -T git@github.com
為密鑰為 id_rsa_X 的使用者提供一條問候消息。
有任何想法嗎?
編輯:對 vgoff 評論的回應——不,它似乎正在閱讀我所有的配置……
$ ssh -vT git@github.com-X OpenSSH_5.6p1, OpenSSL 0.9.8y 5 Feb 2013 debug1: Reading configuration data /Users/<username>/.ssh/config debug1: Applying options for * debug1: Applying options for github.com-X debug1: Reading configuration data /etc/ssh_config debug1: Applying options for * debug1: auto-mux: Trying existing master debug1: Control socket "/Users/<username>/.ssh/connections/ssh-git@github.com:22" does not exist <snip>
您可以看到它讀取了所有設置並嘗試使用錯誤的 ControlPath。
您需要將不太具體的選項進一步向下移動
~/.ssh/config
。選項首先Host *
應用,並且它們不會被後來的衝突選項覆蓋,即使它們更具體。但是,將應用未指定的新選項,Host *
我認為這就是您在日誌中看到的內容。來源: http: //linux.die.net/man/5/ssh_config
ssh(1) 按以下順序從以下來源獲取配置數據:
- 命令行選項
- 使用者的配置文件 (~/.ssh/config)
- 系統範圍的配置文件 (/etc/ssh/ssh_config)
對於每個參數,將使用第一個獲得的值。配置文件包含由“主機”規範分隔的部分,該部分僅適用於與規範中給出的模式之一匹配的主機。匹配的主機名是命令行中給出的主機名。
由於使用了每個參數的第一個獲得值,因此應在文件開頭附近給出更多特定於主機的聲明,並在結尾處給出一般預設值。