如何在 Mac OS X Lion 上使用 SSH 私鑰登入而無需每次都輸入密碼?

如何在 Mac OS X Lion 上使用 SSH 私鑰登入而無需每次都輸入密碼?

我使用 Mac OS X Lion 並每天透過 SSH 登入遠端主機。儘管我使用 SSH 金鑰對進行遠端驗證,並且不需要機動化每個主機的登入短語,但終端要求輸入密碼來存取我的 SSH 私鑰仍然非常煩人。

出於安全原因,我認為存取 SSH 私鑰的密碼是必須的。有沒有一種方法可以讓終端在啟動時只詢問該短語一次,然後記住它,並在以後的 SSH 會話中自動使用我的私鑰?

有一個名為的腳本keychain在 Gentoo Linux 上運作良好。但我從來沒有在 Mac OS X Lion 上弄清楚這一點。更重要的是,還有很多令人生畏的術語,例如ssh-agentssh-add。在閱讀了有關 SSH 工具包的各種資料並做了一些失敗的實驗後,我變得更加困惑。

因此,我來到StackExchange,尋求有關以下問題的一些建議。

  1. ssh-agentssh-add、是什麼keychain以及Keychain Access.app它們如何相互作用?
  2. 如何在登入時輸入 SSH 私鑰的密碼,並在以後創建 SSH 會話時自由使用它?
  3. 呃……怎麼了Keychain Access.app?它不像以前那樣儲存 SSH 短語。

我在這裡列出了我所做的事情。希望有關於我錯過的步驟的線索。

步驟 1. 在我的 Mac 上建立 SSH 金鑰對。

$ ssh-keygen -t rsa -C "[email protected]"
# Set a passphrase for accessing the private key.

步驟 2. 將我的 SSH 公鑰複製到遠端主機。舉個例子,我將金鑰複製到本機主機 Mac。

$ ssh-copy-id USER@localhost
# Enter the login password for USER at localhost, not my SSH passphrase

步驟 3. 然後嘗試透過 SSH 金鑰對驗證連線到遠端主機(此處為 localhost)。

$ ssh USER@locahost
Enter passphrase for key '/Users/YOUR_ACCOUNT/.ssh/id_rsa': 
# Enter my SSH passphrase, not the login password.

步驟 4. 從遠端主機登出並嘗試再次連線。該死的,終端機再次要求輸入 SSH 短語。

一個常見問題是“ssh-agent 在您的 Mac 上運作良好嗎?”。坦白說,我不知道這些事情是怎麼回事。這裡展示一些運行結果。

$ echo $SSH_AUTH_SOCK
/tmp/launch-M48niA/Listeners
$ echo $SSH_AUTH_PID
(EMPTY)
$ ssh-add -l
Could not open a connection to your authentication agent.
$ ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-Z54zXukQiP/agent.26769; export SSH_AUTH_SOCK;
SSH_AGENT_PID=26770; export SSH_AGENT_PID;
echo Agent pid 26770;
$ ssh-add -l
Could not open a connection to your authentication agent.
$ echo $SSH_AUTH_SOCK
/tmp/launch-M48niA/Listeners
$ echo $SSH_AUTH_PID
(STILL EMPTY)
$ ssh-agent  # Oh no, anther ssh-agent with different PID
SSH_AUTH_SOCK=/tmp/ssh-cx0B4FUX8B/agent.26898; export SSH_AUTH_SOCK;
SSH_AGENT_PID=26899; export SSH_AGENT_PID;
echo Agent pid 26899;
$ ps -e | grep -i ssh
26769 ??         0:00.03 ssh-agent
26899 ??         0:00.02 ssh-agent

歡迎任何反饋。謝謝!

答案1

ssh-agent是您想要工作的部分,因為它完全符合您的要求。該代理程式作為守護程序運行,當您向其“添加”私鑰時,它會記住該密鑰並sshd在初始連接期間自動將其提供給遠端設備。 (ssh-add只是您運行以手動添加私鑰的命令ssh-agent)。

在 OS X 中,從 Leopard 開始,您不必執行ssh-agentssh-add手動。當您嘗試連接到伺服器時,它應該「恰好發生」。每個金鑰一次,它都會提示您一個 UI 密碼對話框,該對話框(除其他外)將允許您自動將金鑰新增至 中,ssh-agent這樣您就不會再次收到提示。

這是透過配置launchd監聽套接字上的連接來處理的,並在第一次需要時$SSH_AUTH_SOCK自動啟動;ssh-agent之後,ssh-agent僅在需要開啟新金鑰時才提示您輸入憑證。

如果這不起作用,請確保您有正確的launchd設定檔:

/System/Library/LaunchAgents/org.openbsd.ssh-agent.plist

如果由於某種原因它仍然不適合您,請使用以下“舊”方法來手動運行:

http://timesinker.blogspot.com/2007/08/getting-ssh-agent-going-on-mac-osx.html

還有這個應用程序,自從 Leopard 出現以來我就不再使用它了,但在以前的 Mac OS X 版本中基本上做了同樣的事情:

http://www.sshkeychain.org/

答案2

在解決「問題」的過程中,我用谷歌搜尋了一些相關主題,並寫下了一些關於如何ssh-agent運作ssh-addkeychain筆記KeyChain Access.app。最後發現這個問題根本不是問題,而是我的問題,所謂每次無需詢問密碼即可 ssh 登入開箱即可在 Mac 上完美運作。

不過這個過程也讓我收穫了一些經驗。我在這裡寫下我的筆記,希望它們能幫助那些對這些術語感到困惑的人。

兩個密碼術語:

  • passphrase指存取您的 SSH 私鑰時所需的短語。
  • password指登入 Mac 所需的短語。

現在我可以弄清楚這些工具包的作用了,即 ,,,,,在ssh-agentMac上。ssh-addkeychainKeychain Access.app

  • ssh-agent是無需輸入 SSH 密碼即可使用 SSH 私鑰的關鍵服務。ssh-agent以這種方式工作。首先它存儲,或者快取,主記憶體中的 SSH 私鑰。然後,在此會話的稍後時間,當遠端身份驗證需要您的 SSH 私鑰時,ssh-agent將在主記憶體中找到您的私鑰並將其交給遠端進程。唯一一次要求您輸入 SSH 密碼的情況是ssh-agent最初新增您的私鑰時。
  • ssh-add是集合的一部分ssh-agent,它有助於管理ssh-agent.我們使用ssh-add命令來列出、新增、刪除 ssh-agent 金鑰環中的私鑰。然後ssh-addssh-agent服務進行通訊以完成任務。
  • keychain是用於查找ssh-agent服務(如果不存在,則啟動新服務)並呼叫ssh-add以新增 SSH 私鑰的腳本。keychain有一個簡單直接的想法,在 ssh-agent 通常不會自動啟動的 Linux 上運作得很好。
  • Keychain Access.app似乎是最複雜的組件。它是Mac OS X 的通用令牌儲存服務。它儲存各種令牌,例如密碼、憑證等,並作為令牌代理人對於那些請求令牌的應用程式。在我們的 SSH 私鑰案例中,它首先捕獲訪問 SSH 私鑰的請求,並彈出一個窗口,要求您將 SSH 密碼(一種令牌)儲存到Keychain Access.app金鑰環中。然後下次使用私鑰進行認證時,Keychain Access.app再次彈出窗口,詢問是否授予權限。獲得肯定後,keychain Access.app將您的私鑰添加到ssh-agent的儲存空間。

有兩件事值得你注意:

  1. Mac OS X Lionssh-agent在啟動時自動啟動一個服務,監聽/tmp.
  2. Keychain Access.app儲存您的 SSH 密碼,因此它可以在不打擾您的情況下添加您的私鑰ssh-agent。是的,無需輸入您的 SSH 短語,但首次建立此條目時需要輸入您的 Mac 帳戶的登入密碼以授予權限。

所以,總而言之,SSH-login-without-asking-passphrase 應該可以在 Mac OS X 上開箱即用。

答案3

如果這裡的其他解決方案對人們不起作用,以下內容對我有用。

對於 ~/.ssh 目錄中的每個私鑰,請確保相應的公鑰也存在。確保公鑰的名稱與私鑰完全相同,但.pub結尾帶有 。如果您已有合適的公鑰,請嘗試重新產生它。

如果您需要重新建立公鑰,您可以輕鬆完成:-

ssh-keygen -y -f ~/.ssh/my_key > ~/.ssh/my_key.pub

替換my_key為您的密鑰的名稱。

之後,MacOS 會按照應有的方式記住鑰匙圈中的密鑰密碼。

注意- 輸入密碼並將其保存到鑰匙圈現在是一次性操作(而不是像OP 想要的那樣每個登入工作階段一次),但假設登入有問題的mac 受密碼保護,那麼您的密碼將受到該登入密碼的保護。另外,這個解決方案對我來說沒有任何意義...除了私鑰之外,不應該需要公鑰,但由於某種原因 MacOSX 需要它。

(最初是從回答Apple Stack Exchange 上的類似問題)

答案4

您可以嘗試的另一件事是用ssh-copy-id類似.k="$(cat ~/.ssh/id_rsa.pub)"; ssh [email protected] "umask 0077; mkdir -p ~/.ssh; echo "$k" >> ~/.ssh/authorized_keys2"

相關內容