Ssh-agent'ı isteğinize göre anahtar otomatik olarak nasıl ekleyebilirim?


51

Ssh-agent'ı çalıştırmak istiyorum (maksimum ömür boyu seçeneğiyle), ancak başlangıçta herhangi bir anahtar eklemek istemiyorum, bunun yerine talep üzerine ekleyin.

Bazı sunuculara ilk giriş yaptığımda olduğu gibi parola sormalı, bir dahaki sefere (bir saatten fazla beklemeden sürece) temiz bir şekilde bağlanmalıdır:

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':

Her seferinde 'ssh-add' komutunu çalıştırmayı elle hatırlamak istemiyorum. (örneğin sadece ssh için girilen parolayı girin ve "Ah, hatırlamadı, yeniden yazmanız gerekiyor").

Kullanıcı parolayı sağlarsa ssh, ssh-agent'a otomatik olarak anahtar ekleyecek şekilde nasıl yapılandırılır?


Yanıtlar:


58

ssh, ilk kullanımda ajana bir anahtar eklemeyi destekler (sürüm 7.2'den beri). Aşağıdakileri koyarak bu özelliği etkinleştirebilirsiniz ~/.ssh/config:

AddKeysToAgent yes

Bu, git gibi türev araçları kullanırken de çalışır.

Gönderen 7.2 değişmek :

  • ssh (1): 'evet', 'hayır', 'sor' veya 'onayla' olarak ayarlanabilen ve varsayılan olarak 'hayır' olarak ayarlanabilen bir AddKeysToAgent istemci seçeneği ekleyin. Etkinleştirildiğinde, kimlik doğrulama sırasında kullanılan özel bir anahtar çalışıyorsa ssh-agent'a eklenecektir ('onayla' olarak ayarlanmışsa onayla).

Bu, çalışan bir ssh aracısı gerektirir. Başlamak için iyi bir yol için stackoverflow.com/a/24347344/4573065 + yorumlarına bakın (sadece bir kez).
ST-DDT

18

Hile ve benzeri bir şey koymak olabilir alias ssh='ssh-add -l || ssh-add && ssh'senin üzerinde .bashrc/ ' .profile. Bu, ilk olarak ssh-add -l0 döndürür (aracıda anahtarlar vardır), 1 (anahtarsız) veya 2 (çalışan ajan yok); 0 döndürürse, sshçalışacak; eğer 1, ssh-addkoşacak ve sonra ssh; 2 ssh-addise başarısız olur ve sshçalıştırılmaz. Çalışan hiçbir ajan yokken bile çalıştırmak istiyorsanız , &&ile değiştirin .;ssh


3
Daha fazla ssh komutu kullanılmasa bile, tuşa şifre isteyecektir.
Vi.

@Vi. true, ancak nadir, bunları kullanmayan komutlardır (klavye etkileşimli kullanan bir sunucuya bağlanmadıkça). Anahtar, daha sonra ne zaman ihtiyacın olursa acentada olacak. Ayrıca, neyse ki diğer adı (veya ne yazık ki), ssh'ın arka uç kullanımlarını değiştirmez (git veya rsync gibi).
Jessidhia

2
(ssh istemcisi için auto-call-ssh-add yaması yazmayı düşünüyorum)
Vi.

Bu cevap dayanarak, belirli bir ana için bir takma ad oluşturabilirsiniz: alias ssh-hostname='(ssh-add -l | grep hostname > /dev/null) || ssh-add ~/.ssh/id_rsa_hostname && ssh -p 12345 username@hostname'. Bunu tüm ssh anahtarlarınız için bir döngüye koyabilir ve takma adlar oluşturabilirsiniz. Kirli bir kesmek, ama işe yarıyor.
dset0x

5

Otomatik çağrı-ssh-add ssh tarafından desteklenene kadar .bashrc, Kovensky'nin önerisine dayanarak şunu ekledim :

ssh-add -l >/dev/null || alias ssh='ssh-add -l >/dev/null || ssh-add && unalias ssh; ssh'

Diğer ad yalnızca kimlik eklenmemişse oluşturulur ve diğer ad çalıştırıldığında kendisini yok eder.

Bu şekilde normal ssh komutu kimlik eklendikten sonra kullanılır.


Benim durumumda çalışmadığı için ssh-add özelliği de zaman aşımına uğradı, ancak fikir yeterince iyi.
Vi.

@Vi. Zaman aşımı bunu nasıl etkiler? Benim için harika iş gibi görünüyor.
lanrat

1
@lanrat, Bu, ssh-agent'ta anahtar olup olmadığını kontrol eder ve varlığa bağlı olarak diğer adı yapılandırır. Ancak timeout ( ssh-add -t ...) nedeniyle ssh-agent'a eklenen anahtar birdenbire kaybolabilir, ancak takma ad hala bellekte olduğu gibi kalacaktır.
Vi.

1

Aşağıdaki kabuk işlevini kullanıyorum:

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 $?
}

Önce bağlanmaya çalıştığım ana bilgisayarın yapılandırmasını çözer, daha sonra henüz eklenmediyse ve sonra ana bilgisayara bağlanırsa, bu ana bilgisayarın olası anahtarlarını ssh-agent'a ekler. Geliştirilebileceğinden eminim, bu yüzden geribildirim için açığım.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.