如何讓ssh-agent按需自動新增金鑰?

如何讓ssh-agent按需自動新增金鑰?

我想運行 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 代理程式(如果尚未新增),最後連接到該主機。我確信它可以改進,所以我願意接受回饋。

相關內容