題 如何設置SSH以便我不必輸入密碼?


如何設置SSH,以便在連接主機時不必輸入密碼?


137
2017-07-18 16:51


起源


有人可能會爭辯說,如果使用這樣的密鑰不需要密碼。為了避免任何持有您的私鑰的人實際上可以濫用它,可以通過自己的密碼來保護密鑰。當然,可以將該密碼留空,但在許多情況下不建議這樣做。 - Arjan
在最新的帶有最新SSH的Cygwin上,我被重新提示,因為我需要對我的更改 ~/.ssh/config 這是現在需要的 PubkeyAcceptedKeyTypes ssh-rsa*,ssh-dss* - HDave


答案:


生成SSH密鑰(如果沒有)

如果您碰巧使用GNOME,那麼 海馬 應用程序(“密碼和加密密鑰”)可以為您完成: 文件  - >   - > 安全外殼密鑰

如果您更喜歡終端,請運行 ssh-keygen -t <類型> 生成密鑰對。有效的密鑰對類型是:

  • rsa:默認值
  • dsa:或多或少等效,但限制為1024位密鑰
  • ecdsa:具有較小密鑰的相同安全性,但在SSH軟件中相對較新且有點罕見。
  • ed25519:高安全性(更能抵抗側信道攻擊和弱隨機數生成器)。非常快速的簽名生成。很新。僅適用於 OpenSSH> = 6.5

該計劃將要求你 密碼 以及保存新密鑰的位置。建議使用建議的默認路徑,因為所有其他工具都會在那裡查找。

將公鑰上載到遠程服務器

再次, 海馬 通常可以為你做到 - 在 我的個人鑰匙,右鍵單擊SSH密鑰並選擇 配置安全shell的密鑰

要么, ssh-copy-id -i ~/.ssh/id_rsa.pub remote-user@remote-host 在終端。

或者,完全手動一步一步:

  1. 創建一個名為的目錄(如果它已經不存在) .ssh 在遠程主機上的遠程用戶的主目錄中。
  2. 在該目錄中,創建一個名為的文件 authorized_keys (如果它不存在)。
  3. 萬一你的遙控器 umask 比平時更自由,使文件不可寫入組: chmod go-w ~/.ssh ~/.ssh/authorized_keys
  4. 最後,以某種方式複制(附加)您本地的內容 公鑰 (~/.ssh/id_rsa.pub)進入遙控器 ~/.ssh/authorized_keys 文件。

將密鑰加載到ssh代理中

如果您將私鑰加載到ssh中 代理人,它將解密密鑰保存在內存中。我們希望這可以避免每當我們進入服務器時重新輸入密碼。

首先,必須啟動代理程序或將已啟動的通信套接字的路徑加載到變量中。運行 SSH代理 在終端上將生成用於分配和設置代理變量的命令。這些命令可以保存在文件中,以便在不同的終端中使用。或者,可以運行這些命令並忘記在另一個終端中重新使用相同的代理。例如: eval $(ssh-agent)

加載密鑰是一個簡單的執行問題 ssh-add 給它一個密碼短語。

如果您使用的是GNOME, GNOME的鑰匙圈守護 通常提供與ssh-agent相同的SSH代理功能,因此您不需要啟動任何東西。 GNOME也會在登錄時自動加載和解鎖密鑰。

Shell無需密碼即可進入遠程服務器

如果一切都正確完成,使用 ssh 用戶@服務器不會提示您輸入密碼。如果代理有問題而不是密鑰,則會要求您鍵入密鑰的密碼短語,而不是用戶帳戶的密碼。

當代理中加載了正確的密鑰時,任何使用ssh進行通信的東西都可以在不輸入用戶帳戶密碼的情況下工作。程序如 SCPSFTP 和 rsync的 利用這一點。


筆記:

  • 您只需要一個SSHv2密鑰,因為SSHv1非常不安全且現在未使用。
  • 您也只需要一種類型的密鑰 - RSA或DSA就足夠了。 (ed25519和ECDSA都是最近的,因此在任何地方都不受支持)。
  • RSA和DSA密鑰的所有這些步驟都相同。如果您使用DSA,請使用 id_dsa 代替 id_rsa,和ECDSA將有 id_ecdsa
  • 使用3.0以上的OpenSSH服務器 authorized_keys2  - 但你真的不太可能發現使用5.0以上的東西。
  • 這些說明僅適用於OpenSSH 3.0及更高版本。 lshssh.com,和其他(Unix和非)SSH服務器不包括在本教程中。

例子:

  • 將公鑰複製到遠程主機:

    ssh-copy-id -i~ / .ssh / id_rsa.pub myaccount @ remotehost#this
    
    cat~ / .ssh / id_rsa.pub | ssh myaccount @ remotehost \
          'mkdir -p~ / .ssh; cat >>〜/ .ssh / authorized_keys'#或者這個
    
  • 保存代理變量以供重用 (詳細的例子)
    ssh-agent>〜/ .ssh / cross-terminal-agent
    。的〜/ .ssh /交叉終端劑
    

153



啊,你必須說“ssh-add {path-to-private-key-file}”,然後它會詢問你的密碼。請在帖子中更明確地說明這一點。你還應該添加“第四,運行ssh”。這些東西的文檔問題的部分原因在於它掩蓋了看似明顯的步驟,這些步驟對於那些不知道發生了什麼以及這些程序如何協同工作的新手來說並不明顯。 - Jason S
Jason:ssh-add -l用於檢查代理是否正在運行。不帶參數的ssh-add將從默認位置添加密鑰(即〜/ .ssh / id_rsa)。無論如何,更新。 - grawity
有一個命令 ssh-copy-id 將公鑰複製到目標主機並自動設置權限。 - hasen
很棒的答案!它缺少關於密鑰文件的文件權限 - 我今天遇到了一個與此有關的問題。私鑰文件只能由我訪問,公鑰文件只能由我寫。 - ripper234
一個班輪: ssh-keygen -f ~/.ssh/id_rsa -N "";ssh-copy-id -i ~/.ssh/id_rsa username@server-ip-or-address (只需更換 username@server-ip-or-address)。 - totymedli


你沒有指定你所使用的Unix,你正在連接的Unix,你正在使用的shell,你正在使用的SSH變體等等。所以有些可能需要稍微調整一下;這是基於最新版本的OpenSSH,它用於很多unix變種。

這些都來自您的本地桌面系統。

ssh-keygen

確保使用鍵名的默認值。我建議你  在該密鑰上設置密碼,否則會出現安全問題。 “-t rsa”不是一個壞主意,但可能不需要。

ssh-copy-id username@server

這將詢問您用於登錄的密碼,並為您設置authorized_keys的內容。 (無需手動完成)

那麼,這個:

`ssh-agent`

或者這個:

exec ssh-agent sh

要么:

exec ssh-agent bash

這將啟動一個可以保存密鑰的SSH代理。在許多現代Unix變體上,如果您以圖形方式登錄,則已經發生了這種情況。第一個變體(帶有反引號)將ssh-agent放入後台並設置環境變量以與之通信。後兩個讓代理為您運行shell,這樣當您退出shell時,代理退出。

許多現代Unix變體已經有一個代理運行,特別是如果您以圖形方式登錄。你可以嘗試“ps aux | grep ssh-agent“ 要么 ”ps -ef | grep ssh-agent“;如果某些東西已經在運行,請使用它。

然後,最後:

ssh-add

它會要求密碼;給它你給ssh-keygen的那個。還有方法可以用圖形方式詢問。你可以把ssh-agent和ssh-add東西放到你的登錄腳本中(根據你使用的shell設置不同)來實現自動化,但是一些Unix變種(例如當前的Ubuntu Linux)會自動執行大部分操作,所以您真正需要做的就是創建一個密鑰並使用ssh-copy-id在遠程主機上進行設置。

現在,“ssh username@server“應該在不要求任何身份驗證的情況下工作。在幕後,它使用ssh-agent持有的密鑰,並要求代理為其執行魔術簽名技巧。


18





可以這樣做 油灰 在Windows上也是如此。

一旦你有公共/私人密鑰對所有設置(如這裡顯示的其他答案)運行PuttyGen。在那裡,加載您已經設置的現有私鑰,然後將其保存為PuTTY私鑰(ppk)。

然後在PuTTY中,只需單擊要自動登錄的已保存會話,然後單擊“加載”。從此處進入左窗格中的連接 - >數據,並在“自動登錄用戶名”中鍵入該遠程服務器的用戶名:

PuTTY username entry

之後進入Connection - > SSH - > Auth,瀏覽你在PuttyGen中製作的ppk:

PuTTY private key entry

然後返回會話頁面並保存先前加載的會話。


11



第一個圖像鏈接“PuTTY用戶名條目”似乎已被破壞。 - Peter Mortensen
PuTTY包含自己的ssh-agent版本;它叫做Pageant。它在系統托盤中運行並為您保存密鑰。您不需要運行ssh-agent,只需在Auth部分的PuTTY選項中選中“允許代理轉發”,並且Pageant的連接將被轉發到遠程端以使您的密鑰代理可用。 - Kevin Panko


從一個非常相似的問題 ServerFault,我建議使用 SSH-copy-id命令,它執行為您設置身份驗證密鑰所涉及的所有步驟:

ssh-copy-id是一個使用ssh的腳本   登錄遠程計算機   (大概是使用登錄密碼,所以   密碼驗證應該是   啟用,除非你做了一些   聰明地使用多個身份)

它還會更改權限   遠程用戶的家,〜/ .ssh,和   〜/ .ssh / authorized_keys刪除組   可寫性(否則會出現問題)   阻止你登錄,如果   遠程sshd在其中設置了StrictModes   組態)。

如果給出了-i選項,那麼   身份文件(默認為   使用〜/ .ssh / identity.pub),   不管是否有任何   你的ssh-agent中的密鑰。

你需要做的只是這個:

ssh-copy-id user@host

輸入一次密碼,就可以了!


3





除了已經被告知如何設置ssh鍵之外,我建議 鑰匙扣 作為一個 SSH代理 console frontend,它允許您只為每個系統進程而不是每次登錄處理一個。

我知道已經有GNOME和KDE工具可以做同樣的事情,但如果你是 控制台迷 輸入這個很棒(並且可以在大多數Unix系統上使用)。

要使用它,只需將以下內容添加到您的 ~/.bashrc (類似於其他砲彈):

if type keychain >/dev/null 2>/dev/null; then
  keychain --nogui -q <all your SSH/PGP keys>
  [ -f ~/.keychain/${HOSTNAME}-sh ] && . ~/.keychain/${HOSTNAME}-sh
  [ -f ~/.keychain/${HOSTNAME}-sh-gpg ] && . ~/.keychain/${HOSTNAME}-sh-gpg
fi

3





http://linuxproblem.org/art_9.html

你的目標

您希望使用Linux和OpenSSH自動完成任務。因此,您需要從主機A /用戶a到主機B /用戶b自動登錄。您不想輸入任何密碼,因為您想從shell腳本中調用ssh。


2



downvote不是我的,但我不介意人們刪除他們的答案,如果他們發現其他人早些時候發布了幾乎相似的回复。 - Arjan
Arjan:在很大程度上我同意你的觀點,但是當這些帖子只相隔幾秒鐘時,我不一定認為懲罰第二名的人是公平的。我並不是說你必須通過提升來獎勵他們,但是低調會給人的印像是答案是錯誤的,而不是及時 - TheTXI


我寫完這篇非常簡短的教程之後真的非常沮喪真的很長的教程真的很簡單:)

test -f ~/.ssh/id_rsa.pub || ssh-keygen -t rsa #press enter twice if given prompts, then "ssh-add"

scp ~/.ssh/id_rsa.pub destID@destMachine:/tmp/ #type password

ssh destID@destMachine #type password

cat /tmp/id_rsa.pub >> ~/.ssh/authorized_keys

rm /tmp/id_rsa.pub

2





油灰 有個 -pw 讓你在桌面上創建一個快捷方式的選項,如下所示:

"C:\Program Files\PuTTY\putty.exe" -ssh user@192.168.2.2 -pw your_password

2





  1. 在連接主機上,運行 ssh-keygen。 (如果它告訴你必須指定一個類型,那麼 ssh-keygen -t rsa。)當它詢問您文件位置時,請採用默認值。當它要求您輸入密碼短語時,請按Enter鍵以輸入密碼短語。
  2. cat ~/.ssh/id_rsa.pub (或者是默認文件位置) ssh-keygen 是的,雖然你必須有一個  舊 ssh 安裝它是不同的);將輸出複製到剪貼板。
  3. 作為要連接的帳戶正常登錄到目標主機。編輯文件 ~/.ssh/authorized_keys (如果 ~/.ssh 不存在, slogin 到某個地方;這是使用正確的權限創建它的簡單,簡單的方法)。粘貼剪貼板(包含 id_rsa.pub 從其他主機)到這個文件。

1



-1表示不添加密碼短語。沒有密碼,任何閱讀該文件的人現在都可以成為合法用戶。 - bortzmeyer
首先,他要求不必輸入密碼;我真的不認為必須輸入密碼短語而不是密碼才能改進。第二,你錯了;這就是為什麼有一個公鑰和一個私鑰,所以公鑰可以出世界。 - chaos
有問題的密碼在密鑰生成期間輸入,而不是每次連接時都輸入。正確? - Richard Hoskins
否。使用密碼短語生成的密鑰要求在每次使用密鑰時輸入密碼。 - chaos
錯誤。使用ssh-agent(請參閱接受的答案),每個會話只輸入一次密碼。 - bortzmeyer