Ssh

使用特定於主機的聲明更改 ssh ControlPath

  • January 7, 2014

我有一種情況,我需要使用兩個不同的 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) 按以下順序從以下來源獲取配置數據:

  1. 命令行選項
  2. 使用者的配置文件 (~/.ssh/config)
  3. 系統範圍的配置文件 (/etc/ssh/ssh_config)

對於每個參數,將使用第一個獲得的值。配置文件包含由“主機”規範分隔的部分,該部分僅適用於與規範中給出的模式之一匹配的主機。匹配的主機名是命令行中給出的主機名。

由於使用了每個參數的第一個獲得值,因此應在文件開頭附近給出更多特定於主機的聲明,並在結尾處給出一般預設值

引用自:https://serverfault.com/questions/545029