我想運行 ssh-agent (具有最長生命週期選項),但不在啟動時添加任何金鑰,而是按需添加它們。
就像我第一次登入某個伺服器時,它應該要求輸入密碼,下次(除非我等待一個多小時)它應該乾淨地連接:
ssh server1
Enter passphrase for key '/home/vi/.ssh/id_dsa':
server1> ...
ssh server2
server2> # no passphrase this time
# wait for lifetime
ssh server2
Enter passphrase for key '/home/vi/.ssh/id_dsa':
我不想每次都手動記住運行“ssh-add”。 (例如,僅輸入 ssh 的密碼,然後「哦,它不記得了,需要重新輸入」)。
如果使用者提供密碼,如何設定 ssh 自動將金鑰新增至 ssh-agent ?
答案1
ssh 支援在首次使用時為代理程式新增金鑰(自版本 7.2 起)。您可以將以下內容放入以下內容來啟用該功能~/.ssh/config
:
AddKeysToAgent yes
這在使用衍生性工具(例如 git)時也適用。
來自7.2 變更日誌:
- ssh(1):新增 AddKeysToAgent 用戶端選項,可設定為“yes”、“no”、“ask”或“confirm”,預設為“no”。啟用後,身份驗證期間使用的私鑰將被添加到 ssh-agent(如果正在運行)(如果設定為“確認”,則啟用確認)。
答案2
你可以作弊並alias ssh='ssh-add -l || ssh-add && ssh'
在你的.bashrc
/上放置類似的東西.profile
。首先運行ssh-add -l
,它可以返回 0(代理上有密鑰)、1(沒有密鑰)或 2(沒有代理正在運行);如果返回0,ssh
則運行;如果為 1,ssh-add
將運行,然後ssh
;如果為 2,ssh-add
將失敗並且ssh
不會運行。如果您想在沒有代理程式運行的情況下運行,請將 替換&&
為。;
ssh
答案3
在 ssh 支援 auto-call-ssh-add 之前,我.bashrc
根據 Kovensky 提案在我的 中添加了以下內容:
ssh-add -l >/dev/null || alias ssh='ssh-add -l >/dev/null || ssh-add && unalias ssh; ssh'
僅當未添加身份時才會建立別名,並且別名一旦運行就會自行銷毀。
這樣,在新增身分後即可使用常規 ssh 指令。
答案4
我正在使用以下 shell 函數:
ssh() {
local possible_keys=($(/usr/bin/env ssh -G $@ | grep '^identityfile' \
| cut -d " " -f 2- | sed -e "s|^~|$HOME|"))
for k in $possible_keys; do
if [[ -f $k ]]; then
local fingerprint=$(ssh-keygen -lf $k)
ssh-add -l | grep -q "$fingerprint" || ssh-add $k
fi
done
/usr/bin/env ssh $@
return $?
}
它首先解析我嘗試連接的主機的配置,然後將該主機的可能密鑰新增至 ssh 代理程式(如果尚未新增),最後連接到該主機。我確信它可以改進,所以我願意接受回饋。