SSH Agent 轉(zhuǎn)發(fā)功能可以讓您在部署至服務(wù)器的過程更簡便。比起讓您的密鑰(無密碼保護的)存放在服務(wù)器上,SSH 代理轉(zhuǎn)發(fā)功能可以讓您使用本地的 SSH 密鑰。
如果您已經(jīng)設(shè)置好 SSH 密鑰來和 Github 交換數(shù)據(jù),可能已經(jīng)對 ssh-agent 感到熟悉。 ssh-agent 是一個在后臺運行的應(yīng)用程序,它會緩存您已經(jīng)加載到內(nèi)存中的密鑰,這樣便不必每次使用這個密鑰都輸入密碼了。更棒的是,您可以選擇讓服務(wù)器訪問您的本地 ssh-agent ,效果如同 ssh-agent 已經(jīng)在服務(wù)器上運行。這有點像當(dāng)您借用朋友的電腦時,讓朋友幫忙輸入密碼以便讓您使用。
查看 Steve Friedl 的技術(shù)提示指南來獲得關(guān)于 SSH Agent 轉(zhuǎn)發(fā)功能更詳細的解釋。
請確保您自己的 SSH 密鑰已經(jīng)設(shè)置并且可用。如果還沒有完成這步,可以查看我們的生成 SSH 密鑰指南。
您可以在終端中使用命令 ssh -T git@github.com
來測試您的本地密鑰是否可用:
$ ssh -T git@github.com
# 嘗試通過SSH連接Github
Hi username! You've successfully authenticated, but GitHub does not provide
shell access.
我們現(xiàn)在有了一個良好的開端。讓我們設(shè)置 SSH 來允許 agent 轉(zhuǎn)發(fā)到您的服務(wù)器。
使用您最喜歡的文本編輯器, 打開文件 ~/.ssh/config
。 如果這個文件不存在,可以在終端中使用命令touch ~/.ssh/config
來創(chuàng)建一個。
example.com
: `Host example.com`
`ForwardAgent yes`
警告: 您也許會想投機取巧地使用類似
Host *
這樣的帶通配符語句來設(shè)置所有的 SSH 連接。這并不是一個好辦法,因為這樣做會分享您的本地 SSH 密鑰給您用 SSH 連接過的所有服務(wù)器。 雖然他們不能直接訪問您的本地密鑰,但是他們可以以您的名義來使用這些密鑰,只要連接尚未斷開。 所以請務(wù)必只輸入您信任的并且打算使用 agent 轉(zhuǎn)發(fā)功能的服務(wù)器。
您可以用 SSH 連接到您的服務(wù)器并再次執(zhí)行命令 ssh -T git@github.com
來測試 agent 轉(zhuǎn)發(fā)是否有效。如果情況順利,您會得到和本地操作一致的提示。
如果您不能確定目前是否正在使用本地密鑰,可以通過檢視服務(wù)器上的 SSH_AUTH_SOCK
變量:
$ echo "$SSH_AUTH_SOCK"
# 打印輸出 SSH_AUTH_SOCK 變量
/tmp/ssh-4hNGMk8AZX/agent.79453
如果這個變量尚未設(shè)定,說明 agent 轉(zhuǎn)發(fā)功能沒有運作:
$ echo "$SSH_AUTH_SOCK"
# 打印輸出 SSH_AUTH_SOCK 變量
[No output]
$ ssh -T git@github.com
# 嘗試通過 SSH 連接 Github
Permission denied (publickey).
如果您在 SSH agent 轉(zhuǎn)發(fā)功能中遇到問題,以下幾點可以助您排除故障。
您必須使用 SSH URL 來檢查代碼
SSH 轉(zhuǎn)發(fā)功能只能在 SSH URL 下使用,不包括 HTTP(s) URL。 檢查服務(wù)器上的 .git/config 文件并且確保 URL 是 SSH 格式的,類似下文:
[remote "origin"]
url = git@github.com:yourAccount/yourProject.git
fetch = +refs/heads/*:refs/remotes/origin/*
您的 SSH 密鑰必須本地可用
在您的密鑰能通過 agent 轉(zhuǎn)發(fā)功能使用之前,這些密鑰必須在本地上也能正常使用。我們的生成SSH密鑰指南可以幫助您在本地設(shè)置您的 SSH 密鑰。
您的系統(tǒng)必須允許 SSH agent 轉(zhuǎn)發(fā)功能
某些時候,系統(tǒng)配置會不允許 SSH agent 轉(zhuǎn)發(fā)功能。您可以通過終端輸入以下命令來檢查目前是否有系統(tǒng)配置文件正在生效:
$ ssh -v example.com
# 連接到 example.com,附帶詳細除錯輸出
OpenSSH_5.6p1, OpenSSL 0.9.8r 8 Feb 2011
debug1: Reading configuration data /Users/you/.ssh/config
debug1: Applying options for example.com
debug1: Reading configuration data /etc/ssh_config
debug1: Applying options for *
$ exit
# 返回到您的本地命令提示符
在上面的示例中,~/.ssh/config 文件最先被載入,然后是 /etc/ssh_config 文件。我們可以通過下面的命令來確認后來被載入的文件是否覆蓋了我們的設(shè)置:
$ cat /etc/ssh_config
# 打印輸出 /etc/ssh_config 文件
Host *
SendEnv LANG LC_*
ForwardAgent no
在這個示例中,我們的 /etc/ssh_config 文件顯然寫著 ForwardAgent no
,這是阻止 agent 轉(zhuǎn)發(fā)功能工作的方法之一。將這行從文件中刪去應(yīng)當(dāng)可以讓 agent 轉(zhuǎn)發(fā)功能再次正常工作。
您的服務(wù)器必須允許 SSH agent 轉(zhuǎn)發(fā)功能可以用于入站連接上
agent 轉(zhuǎn)發(fā)功能也可能是被您的服務(wù)器阻止了。您可以通過 SSH 連接服務(wù)器并且執(zhí)行 sshd_config
來檢查 agent 轉(zhuǎn)發(fā)功能是否被許可。該命令的輸出應(yīng)該指出 AllowAgentForwarding
已被設(shè)置.
您的本地 ssh-agent 必須處于運行中狀態(tài)
在大多數(shù)電腦上,操作系統(tǒng)會自動為您啟動 ssh-agent
。然而在 Windows 上,您需要手動設(shè)置。我們有一個指南教您如何隨打開 Git Bash 時啟動ssh-agent
.
如果想確認 ssh-agent
正在您的電腦上運行,請在終端中輸入以下命令:
$ echo "$SSH_AUTH_SOCK"
# 打印輸出 SSH_AUTH_SOCK 變量
/tmp/launch-kNSlgU/Listeners
您的密鑰必須對于 ssh-agent 可見
您可以通過以下命令檢查您的密鑰是否對 ssh-agent
可見:
ssh-add -L
如果該命令指出沒有身份可用,那么您需要通過以下命令添加您的密鑰:
ssh-add 您的密鑰
在 Mac OS X 上,當(dāng)系統(tǒng)重新啟動后,ssh-agent 再次啟動時會 “忘記” 這個密鑰。不過您可以通過以下命令將您的 SSH 密鑰導(dǎo)入到密鑰鏈中:
/usr/bin/ssh-add -K 您的密鑰