我從網路上的無數來源了解到(粗略地),為了在沒有密碼的情況下登入遠端伺服器:產生一個 ssh 金鑰,將 pub 版本放在遠端系統上的authorized_keys中;將私有版本放在本地 ~/.ssh/ 目錄中; chmod 它到0600 然後噗,你就進去了。遠端伺服器。
讓我退後一點。我SurnameG
在本地 Mac 上有一個登入名稱。我在遠端系統(其他伺服器)上有一個 SurnameG 帳戶。
我將內容複製~/.ssh/surnameg.pub
到該系統的/home/surnameg/.ssh/authorized_keys。我已經使用-i
Mac 上的 ssh 選項進行了測試,效果很好。
我有一個~/.ssh/id_rsa
(我生成的用於github.com)。
當然,我甚至~/.ssh/surnameg
還有其他一些密鑰,當我嘗試通過以下方式登入時,這些密鑰沒有被“嘗試”otherserver.com:
ssh 1.2.3.4
在這裡,我嘗試使用SurnameG
(目前本機登入使用者)登入我的SurnameG
帳戶其他伺服器。我希望 openssh~/.ssh/surnameg
在嘗試連接時提供,但它沒有 - 讓我們仔細看看詳細選項:
BOX:~ SurnameG$ ssh -v 1.2.3.4
OpenSSH_5.9p1, OpenSSL 0.9.8y 5 Feb 2013
debug1: Reading configuration data /Users/SurnameG/.ssh/config
debug1: Reading configuration data /etc/ssh_config
debug1: /etc/ssh_config line 20: Applying options for *
debug1: Connecting to 1.2.3.4 [50.112.132.124] port 22.
debug1: Connection established.
debug1: identity file /Users/SurnameG/.ssh/id_rsa type 1
debug1: identity file /Users/SurnameG/.ssh/id_rsa-cert type -1
debug1: identity file /Users/SurnameG/.ssh/id_dsa type -1
debug1: identity file /Users/SurnameG/.ssh/id_dsa-cert type -1
debug1: Remote protocol version 2.0, remote software version OpenSSH_5.3
debug1: match: OpenSSH_5.3 pat OpenSSH*
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_5.9
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-ctr hmac-md5 none
debug1: kex: client->server aes128-ctr hmac-md5 none
debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192) sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP
debug1: SSH2_MSG_KEX_DH_GEX_INIT sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY
debug1: Server host key: RSA ax:64:3e:4a:e3:2c:e4:30:dd:36:a4:a0:9x:fa:ba:6b
debug1: Host '1.2.3.4' is known and matches the RSA host key.
debug1: Found key in /Users/SurnameG/.ssh/known_hosts:88
debug1: ssh_rsa_verify: signature correct
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: Roaming not allowed by server
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic
debug1: Next authentication method: publickey
debug1: Offering RSA public key: /Users/SurnameG/.ssh/id_rsa
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic
debug1: Trying private key: /Users/SurnameG/.ssh/id_dsa
debug1: No more authentication methods to try.
奇怪的是,openssh 只提供 ~/.ssh/id_rsa,但這還不是全部。它也“嘗試”〜/.ssh/id_dsa?我不確定兩者之間的區別(提供與嘗試)無論如何,如果我正確閱讀,openssh 永遠不會嘗試我在~/.ssh/*
.
好的,我知道我可以~/.ssh/config
用類似的內容明確描述每個伺服器
Host otherserver
HostName 1.2.3.4
User surnameg
IdentityFile ~/.ssh/surnameg
然後登入
ssh otherserver
這很好,很花花公子,而且效果很好。但實際上,我的 ~/.ssh/config 變得越來越笨拙。可悲的是我cd ~/.ssh && git init
很久以前沒有。但我離題了。
我的問題是:是否有一種更簡單、更快、更自動化的方法讓ssh 在嘗試登入時動態嘗試~/.ssh 目錄中的更多密鑰,或者為您需要的每個伺服器編輯~/. ssh/config連接到配置ssh的唯一方法?我是否誤解了上面關於 SSH 應該如何運作的任何內容?
答案1
如果您想為所有主機提供相同的金鑰,請使用 將它們載入到 SSH 代理程式中ssh-add
。許多 Linux 發行版都會自動啟動一個 - 嘗試ssh-add -l
檢查它是否正在運行,然後載入您的金鑰:
ssh-add ~/.ssh/id_rsa ~/.ssh/surnameg etc.
如果代理程式沒有自動啟動,請將以下內容放入您的~/.profile
:
agent_running() {
[ "$SSH_AUTH_SOCK" ] && { ssh-add -l >/dev/null 2>&1 || [ $? -eq 1 ]; }
}
env=~/.ssh/agent.env
if ! agent_running && [ -s "$env" ]; then
. "$env" >/dev/null
fi
if ! agent_running; then
ssh-agent >"$env"
. "$env" >/dev/null
ssh-add ~/.ssh/id_*
fi
unset env
答案2
還有另一種可能的方法。您可以在IdentityFile
中的選項中使用佔位符ssh_config
。按照man ssh_config
:
%d
—本機使用者的主目錄%u
—本地用戶名%l
—本地主機名%h
—遠端主機名稱%r
—遠端使用者名稱
我這樣使用它(在全域ssh_config
文件中):
IdentityFile ~/.ssh/%r@%h
這意味著我的私鑰檔案的命名類似於[email protected]
.