Şifre sormadan ssh-add'i otomatik olarak nasıl çalıştırabilirim?


247

Ağımdaki birkaç bilgisayar (statik Ethernet) ile SSH üzerinden iletişim kurmak istiyorum. Bunu yapmak için, belirli bir makineye her giriş yaptığımda ssh-add komutunu çalıştırmam gerekiyor, bir kere kurulabilmesi için nasıl giriş yapabilirim ve her giriş yaptığımda veya yeniden başlattığımda parola sormamı istemiyor. benim makinem

bash_profileDosyaya bazı satırlar eklemenin bir yolu olduğunu biliyorum , ancak belirli bir makineye her yeniden başlattığımda / oturum açtığımda hala şifreyi yazmam gerekiyor.

if [ -z "$SSH_AUTH_SOCK" ] ; then
    eval `ssh-agent -s`
    ssh-add
fi

Yanıtlar:


348

Bu, güvenlik ve rahatlık arasındaki değişimin tipik bir örneğidir. Neyse ki çeşitli seçenekler var. En uygun çözüm kullanım senaryosuna ve istenen güvenlik seviyesine bağlıdır.

şifre ile ssh-key, hayır ssh-agent

Anahtarın kimlik doğrulaması için her kullanıldığında parolanın şimdi girilmesi gerekir. Güvenlik açısından en iyi seçenek bu olsa da, en kötü kullanılabilirliği sunar. Bu aynı zamanda sırayla girmenin yükünü azaltmak için sırayla seçilen zayıf bir parolaya yol açabilir.

ile parola içeren ssh-key ssh-agent

Aşağıdakini eklemek, oturum açma sırasında ssh anahtarlarını / anahtarlarını ~/.bash_profileotomatik olarak başlatır ssh-agentve yükler:

if [ -z "$SSH_AUTH_SOCK" ] ; then
  eval `ssh-agent -s`
  ssh-add
fi

Şimdi her girişe şifre girilmelidir. Kullanılabilirlik açısından biraz daha iyi olsa da, bu ssh-agentoturum açma oturumu sırasında anahtarın kullanılıp kullanılmamasına bakılmaksızın parolayı isteyen dezavantajı vardır . Her yeni oturum açma, ayrıca ssh-agent, açıkça öldürülmediği sürece, oturumu kapattıktan sonra bile bellekte eklenmiş tuşlarla çalışmaya devam eden ayrı bir örnek oluşturur.

ssh_agentOturumu kapattıktan sonra öldürmek için aşağıdakini ekleyin.~/.bash_logout

if [ -n "$SSH_AUTH_SOCK" ] ; then
  eval `/usr/bin/ssh-agent -k`
fi

veya aşağıdakilere ~/.bash_profile

trap 'test -n "$SSH_AUTH_SOCK" && eval `/usr/bin/ssh-agent -k`' 0

Collin Anderson'ın cevabındassh-agent olduğu gibi, dosya sisteminde sabit bir yerde aracıya kalıcı bir iletişim soketi oluşturarak birden fazla örnek oluşturmaktan kaçınılabilir . Bu, birden fazla aracı örneği üretme konusundaki bir gelişmedir, ancak şifresi çözülen anahtarın açıkça öldürülmediği sürece, oturum kapattıktan sonra hala bellekte kalır.

Masaüstlerinde, Gnome Keyring SSH Agent gibi masaüstü ortamına dahil olan ssh aracıları, genellikle bir oturum açma oturumu sırasında ilk kez ssh-anahtarını kullandığınızda parola istemek için yapılabileceklerinden daha iyi bir yaklaşım olabilir. şifresi çözülmüş özel anahtarı oturumun sonuna kadar hafızada saklayın.

ile parola içeren ssh-key ssh-ident

ssh-identssh-agentsizin adınıza yönetebilen ve gerektiğinde kimlikleri yükleyebilen bir yardımcı programdır . Bir erişim gerektiren kaç terminal, ssh veya oturum açma oturumuna bakılmaksızın, gerektiğinde yalnızca bir kez anahtar ekler ssh-agent. Ayrıca bağlı olan ana bilgisayara veya ssh dizinine bağlı olarak farklı bir aracı ve farklı anahtarlar ekleyebilir ve kullanabilir. Bu, farklı konaklarla ajan iletimi kullanırken anahtarların izole edilmesini sağlar. Ayrıca GitHub gibi sitelerde birden fazla hesap kullanılmasına izin verir.

Etkinleştirmek için ssh-identyükleyin ve aşağıdaki takma adları bilgisayarınıza ekleyin ~/bash_profile:

alias ssh='/path/to/ssh-ident'

ile parola içeren ssh-key keychain

keychainssh-agentsizin adınıza yöneten ssh-agentve oturum açma oturumu sona erdiğinde çalışmaya devam etmesini sağlayan küçük bir yardımcı programdır . Sonraki girişlerde, keychainmevcut ssh-agentörneğe bağlanacaktır . Uygulamada bu, parolanın yalnızca yeniden başlatmanın ardından ilk giriş sırasında girilmesi gerektiği anlamına gelir. Sonraki oturum açmalarda, varolan ssh-agenteşgörünümden şifrelenmemiş anahtar kullanılır. Bu, cronşifresiz ssh tuşları olmadan işlerde şifresiz RSA / DSA kimlik doğrulamasına izin vermek için de yararlı olabilir .

Etkinleştirmek için keychainyükleyin ve aşağıdakine benzer bir şey ekleyin ~/.bash_profile:

eval `keychain --agents ssh --eval id_rsa`

Görüş güvenlik açısından, ssh-identve keychaindaha kötü ssh-agentbelirli bir oturum ömrü ile sınırlı durumlarda, ancak kolaylık yüksek düzeyde sunuyoruz. Güvenliğini artırmak için keychain, bazı insanlar --clearkendi ~/.bash_profileanahtarlık çağrısına seçenek ekler . Bu parolaları yaparak giriş yaparken yukarıdaki gibi tekrar girilmelidir, ancak cronkullanıcı oturumu kapattıktan sonra işler hala şifrelenmemiş anahtarlara erişebilir. keychain Wiki sayfası daha fazla bilgi ve örnekler vardır.

parola olmadan ssh-key

Bir güvenlik açısından, bu en kötü seçenektir, çünkü özel anahtar, maruz kalması durumunda tamamen korunmaz. Bununla birlikte, parolanın bir yeniden başlatma işleminden sonra tekrar girilmesine gerek olmadığından emin olmanın tek yolu budur.

parola içeren ssh-key, ile ssh-agent , parolayı komut dosyasından geçenssh-add

Parolayı ssh-addbir komut dosyasından geçirmek basit bir fikir gibi görünse de , örneğin echo "passphrase\n" | ssh-add, ssh-add parolayı nereden okuduğunustdin/dev/tty göründüğü kadar düz değil , doğrudan okumak için açılır .

Bu edilebilir çalıştı ile expectotomatik etkileşimli uygulamalar için bir araç. Aşağıda, komut dosyasında depolanan bir parolayı kullanarak bir ssh anahtarı ekleyen bir komut dosyası örneği verilmiştir:

#!/usr/bin/expect -f
spawn ssh-add /home/user/.ssh/id_rsa
expect "Enter passphrase for /home/user/.ssh/id_rsa:"
send "passphrase\n";
expect "Identity added: /home/user/.ssh/id_rsa (/home/user/.ssh/id_rsa)"
interact

Parolanın komut dosyasında düz metin olarak depolandığından, güvenlik açısından, parola içermeyen bir ssh anahtarına sahip olmaktan çok daha iyi olduğunu unutmayın. Bu yaklaşım kullanılacaksa, expectparolayı içeren betiğin kendisine ayarlanmış uygun izinlere sahip olduğundan emin olmak önemlidir ; bu, yalnızca anahtar sahibi tarafından okunabilir, yazılabilir ve çalıştırılabilir olmasını sağlar.


1
Tamam, ancak kodunuzu ~ / .bash_profile dosyasına koyduğumda her giriş yaptığımda şifreyi girmem gerekiyor, ben de istemiyorum. Güvenlik konusunda hiç endişelenmiyorum. yankı "pass \ n" | ssh-add çalışmıyor
zdun8

3
@ user1607072 Evet, kod ssh-agentparçacığının ~/.bash_profilecevabında açıklandığı gibi davranması budur. keychainYardımcı programa bakmak isteyebilirsiniz . İle keychainEğer yeniden başlatıldıktan sonra ilk girişte şifre girmeniz gerekir, ancak sonraki girişlerde keychainvarolan bağlanacak ssh-agentbellekte deşifre anahtarla örneğin. Bunun dışında bir parola olmadan bir ssh-key oluşturma seçeneği var, ama bu elbette tavsiye edilmez.
Thomas Nyman

3
@ user1607072 Daha güvenli yaklaşımlardan birini şiddetle öneririm, ancak parolayı ssh-addbir komut dosyasından geçirmenin bir yolu var . echo "pass\n" | ssh-addİşe yaramaması sebebi ssh-addparolayı okumaması stdin, ancak /dev/ttydoğrudan okuma için açılmasıdır . Bunun için bir geçici çözüm içerecek şekilde yanıt adı verilen bir yardımcı program kullanılarak güncelleştirildi expect.
Thomas Nyman

1
@ user1607072 Kullanım durumunuz için biraz overkill olabilir, ancak Kerberos , ssh GSSAPI desteğiyle birlikte şifresiz ssh girişleri için de kullanılabilir. Ssh'de karşılık gelen kimlik doğrulama yöntemi çağrılır gssapi-with-mic. Bu genellikle daha büyük ağlarda kullanılır, ancak elbette buna ilginiz varsa, araştırmaya değer olabilir.
Thomas Nyman 18:13

1
@ErickBrown: Burada zaten yanıtlandı . Kullanıcı oturumunu sistemd oturum açma yöneticisinde devre dışı bıraktıysanız, SSH Agent birimi oturumu kapattığında durdurulmalıdır . Kullanıcıda kalma süresi etkinleştirilmişse, son oturum açma oturumu kapatıldıktan sonra bile sistemd kullanıcı örneği ve SSH Agent birimi çalışmaya devam eder.
Thomas Nyman

93

Bunu kendinize ekleyin ~/.bashrc, ardından etkin olmak için oturumu kapatın ve tekrar girin.

if [ ! -S ~/.ssh/ssh_auth_sock ]; then
  eval `ssh-agent`
  ln -sf "$SSH_AUTH_SOCK" ~/.ssh/ssh_auth_sock
fi
export SSH_AUTH_SOCK=~/.ssh/ssh_auth_sock
ssh-add -l > /dev/null || ssh-add

Bu, her yeniden başlatma işleminden sonra ilk giriş yaptığınızda yalnızca bir parola soracaktır. Çalışmaya devam ssh-agentettiği sürece tekrar kullanmaya devam edecektir .


1
çok temiz, bu şekilde çalışan tek bir ssh-agent var (: @ thomasNyman'ın ikinci çözümünde olduğu gibi birden fazla ajan benim için bir güvenlik riski gibi görünüyor ...
drevicko 11

1
Çeşitli sitelerde araştırma yaptıktan ve çeşitli çözümler okuduktan sonra, buradaki en net noktaya kadar açık görünüyor. Çok hoş. +1
Dr Beco,

1
Bunu yapmak daha iyi: `alias ssh = ssh-check-agent" ve check-agent sürümünün yukarıdakileri yapmasını sağlayın. Bu şekilde: a) Sadece bir ajan alırsınız ve b) Sadece ihtiyacınız olursa aracı alırsınız
Erik Aronesty

2
Bence -s varsayılan, bu yüzden zaten yapıyoruz.
Collin Anderson

1
ssh-add -lTemsilci kimlikleri olduğunda 1 çıkış kodunu döndürür ve en son komuttan grep'i kesip kullanamazsanız 1 alırssh-add -l > '/dev/null' || ssh-add
Grant Humphries 2:

16

OP'nin sorusuyla yakından ilgili değil, ancak başkaları için faydalı olabilir: 7.2.0'dan beri ssh (1) ilk kimlik doğrulaması üzerine ssh-agent'a bir anahtar eklemeyi sağlayan bir seçeneğe sahiptir; seçenektir AddKeysToAgentve ayarlanabilir için yes, no, askveya confirm, sistem çapında veya kişisel üzerine .ssh/configdosyaya.

Referans: https://www.openssh.com/txt/release-7.2


2
.ssh/configDosyada yeni olanlar için geçerlidir: bu , örneğin arkası için sshkullanılan her şey için geçerlidir ve sshörneğin scp, ana bilgisayar başına yapılabilir.
SEoF

Yine de her giriş yaptığımda ve örneğin gitmeye çalıştığımda şifre sormamı istiyor.
trainoasis

@trainosis Sorun, şifresi çözülmüş anahtar (lar) ı daha sonra kullanmak üzere bellekte tutmaya çalışan bir ssh-agent örneği bulunmamasıdır. Sadece ssh-agent kullanırken oturum açma oturumu başına belirli bir anahtarın şifresini girmeniz gerekir.
eestrada

7

ssh-agent kilidi açılmış çeşitli ssh-key'leri önbelleğe alır, böylece ssh-pass'ları şifrelerle koruyabilirsiniz, ancak her seferinde yazmak zorunda kalmazsınız.

Kilidi açılmış tuşları önbelleğe almak için bu anahtarların kilidini açması gerekir. Bir parola ile kilitlenmiş anahtarların kilidini açmak için, açıkça bu parolaları bilmesi gerekir.

Bir insandan izin almayı gerektirmeyen herhangi bir yöntem (örneğin, "bir parola yazarak") yalnızca sisteminizi güvensiz yapmaz; Aynı zamanda ssh-ajanının bütün amacını anlamsız hale getirecektir.

Tüm bunları söyledikten sonra, sadece şifre korumalı olmayan ssh anahtarlarını kullanabilirsiniz ( Enteranahtar oluşturma sırasında şifre istendiğinde isabet edin ). Herhangi bir şifre ssh-agentolmadığı için, önbelleğe almak (değil) için sizden bir tane sormanız gerekmez.


Anahtarlarınız yalnızca kullanıcı tarafından uygun şekilde izin verildiği sürece, ssh-agent’ın izinsiz anahtarlar üzerinde çok az avantajı olduğunu kabul ediyorum. Bir oturum açma sunucusuna ssh yapmayı seviyorum, ve sonra, o sunucunun her biri yalnızca bir diğer sunucunun kilidini açmak için kullanılabilen bir sürü perdesiz anahtarı var. oturum açma sunucusu başka hiçbir şey yapmaz, bu yüzden hack / spoof, vb ... çok daha zordur ... diğer sunucuların parola erişimi yoktur, yalnızca anahtardır.
Erik Aronesty

5

İşte SSH parolanızı otomatikleştirmek için bir geçici çözüm.

  1. Parolanızı standart çıktıya yazdıran tek bir komut dosyası oluşturun, örneğin:

     echo 'echo MY_SSH_PASSWORD' > ~/.print_ssh_password && chmod 700 ~/.print_ssh_password
    

    Önemli: Parolanızı geçmişinize kaydetmemek için baştaki alanı kopyaladığınızdan emin olun .

Ve aşağıdaki yöntemlerden birini kullanın.

  • standart bir giriş yaklaşımı kullanarak:

    cat ~/.ssh/id_rsa | SSH_ASKPASS=~/.print_ssh_password ssh-add -
    
  • veya adlandırılmış boru yaklaşımı:

    1. Adlandırılmış bir boru oluşturun (bir işlem değişimini de deneyebilirsiniz ):

      mkfifo --mode 0600 ~/.ssh_fifo
      
    2. ssh-addKimlik doğrulama için kullanılan programı belirterek çalıştırın :

      cat ~/.ssh/id_rsa >~/.ssh_fifo | SSH_ASKPASS=~/.print_ssh_password ssh-add ~/.ssh_fifo
      

    Bakınız: man ssh-addhakkında daha fazla bilgi için SSH_ASKPASS.


2
Bu echo my_passphrasebüyük bir güvenlik deliğidir. İlk girdikten sonra, şifre, kullandığınız kabuğun geçmiş dosyasında açık bir şekilde yazılmıştır. İkinci komut satırı argümanları Unix ( ps -ef) üzerinden dünyaca okunabilir . Şifreleri asla komut satırı argümanlarına koymayın!
16'da 9

1
@ceving Ekstra boş alan eklemek, geçmiş dosyasındaki sorunu çözer. Ekstra bilgi eklendi.
kenorb

@ kenorb: Çıktıda görünen parolanın en büyük sorununu çözmez ps. Geçmiş dosyası genellikle yine de yalnızca sahibi olan kullanıcı tarafından okunabilir, ancak komut satırları bir sistemdeki tüm kullanıcılar tarafından okunabilir.
Thomas Nyman

4

Oturum açma sırasında ssh-add (bir ssh-agent açmanız gerekir) tavsiye etmeyeceğim. Bunun nedeni, ssh-agent bölümünün ne zaman biteceğini kontrol edememeniz ve bir giriş bölümünde anahtar dosyaları kullanmanız gerekmediğinde güvenlik riski oluşturabileceğinizdir.

Daha ziyade, bir ssh aracısının bölüm alt kabuğunu açan, tüm anahtar dosyalarının otomatik olarak eklendiği ve ssh kullanımı gerektiğinde çağrılan bir komut dosyası yazmanızı öneririm. Bunu benimseyebilirseniz, okumaya devam edin.

İki seçeneğiniz olacak:

  1. Anahtar dosyalarınız çalındığında zayıf güvenliği olan anahtarlarınız için tüm parolaları kaldırın . (bu nedenle tavsiye edilmez )

  2. Anahtarlarınız için aynı parolayı kullanın. Daha sonra ssh-add keyfile1 keyfile2 ..., parola bölümünü yalnızca bölüm başına bir kez yazmanız gerekir.

Her iki durumda da, "ssh_keys_section.sh" gibi bir komut dosyası dosyasını aşağıdaki gibi yazabilirsiniz:

#!/bin/bash
# This script run a ssh-agent on a sub-shell and automatically ssh-add all keyfiles at once.
# This agent ends when you type `exit` to close the sub-shell.
exec ssh-agent bash -c "ssh-add /path/to/keyfile1 /path/to/keyfile2 ...; exec bash"

Uyarılar:

  • Parolayı değiştirme veya silme komutu: ssh-keygen -p -f keyfile
  • Alt kabuğun içinde, aynı kilidi açılmış anahtarları paylaşan daha fazla terminali /path/to/yourterminal &( belki de işletim sistemine bağlı)

Örneğin, Cygwin içindeki Windows'ta, /path/to/yourterminal &==>mintty &
Johnny Wong

2
if [ ! -S ${HOME}/.ssh/ssh_auth_sock ]; then
  eval $(ssh-agent)
  ln -sf "${SSH_AUTH_SOCK}" ${HOME}/.ssh/ssh_auth_sock
fi
export SSH_AUTH_SOCK=${HOME}/.ssh/ssh_auth_sock

ssh_keys=$(find -E ~/.ssh -type f -regex '.*(rsa$|pem)')
ssh_agent_keys=$(ssh-add -l | awk '{key=NF-1; print $key}')

for k in "${ssh_keys}"; do
    for l in "${ssh_agent_keys}"; do
        if [[ ! "${k}" = "${l}" ]]; then
            ssh-add "${k}" > /dev/null 2>&1
        fi
    done
done

2

Steampowered tarafından belirtilen senaryoyu kullandım, şimdi aşağıdakini yaptım çünkü etrafta dosya bırakmıyor.

zshSadece kabuk üzerinde çalışıyorum .

#!/bin/sh

AGENT_BIN=`which ssh-agent`
AGENT_ADD_BIN=`which ssh-add`
AGENT_PID=`ps -fe | grep ${AGENT_BIN} | awk -vuser=$USER -vcmd="$AGENT_BIN" '$1==user && $8==cmd{print $2;exit;}'`
if [ -z "$AGENT_BIN" ]; then
    echo "no ssh agent found!";
    return
fi
if [ "" -eq "$AGENT_PID" ]; then
    if read -sq "YN?Do you want to unlock your ssh keys?"; then
        echo ""
        output=`$AGENT_BIN | sed 's/echo/#echo/g'`
        eval $output
        $AGENT_ADD_BIN
    fi
else
    for f in "/proc/"*
    do
        cmdline=`cat "$f/cmdline"`
        if [ "${AGENT_BIN}" -ef "${cmdline}" ]; then
            export SSH_AUTH_SOCK=`cat $f/net/unix | grep --binary-file=text -oP '((/[^/]*?)+/ssh-[^/]+/agent\.\d+$)'`
            export SSH_AGENT_PID=${f##*/}
            break;
        fi
    done
fi

1
SSH_ENV="$HOME/.ssh/environment"

function start_agent {
     echo "Initialising new SSH agent..."
     /usr/bin/ssh-agent | sed 's/^echo/#echo/' > "${SSH_ENV}"
     echo succeeded
     chmod 600 "${SSH_ENV}"
     . "${SSH_ENV}" > /dev/null
     /usr/bin/ssh-add;
}

# Source SSH settings, if applicable

if [ -f "${SSH_ENV}" ]; then
     . "${SSH_ENV}" > /dev/null
     #ps ${SSH_AGENT_PID} doesn't work under cywgin
     ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
         start_agent;
     }
else
     start_agent;
fi

Burada kredi vermek: https://www.cygwin.com/ml/cygwin/2001-06/msg00537.html

Bu çözüm burada da desteklenmektedir: http://mah.everybody.org/docs/ssh


1

SSH için tek bir çözüm işareti bana neden olabilir pam_ssh.

Bu makaleye göre , kavram şudur:

Birden fazla * nix tabanlı makineyle ssh üzerinden çalışıyorsanız, başka bir kutuya her erişmek istediğinizde şifrenizi sürekli girmek zorunda kalmazsınız. Başka bir şifre girmenize gerek kalmadan, ssh erişiminiz olan her makineye erişebilmenin güvenli bir yolu vardır (başlangıçta imzaladığınızdan başka).


Bunu yapmak aslında oldukça basittir, temelde yalnızca diğer makinelerinize kimlik doğrulaması yapmak için genel / özel bir anahtar çifti oluşturursunuz, daha sonra PAM oturum açtıktan sonra tüm uzaktan kumandanıza erişmek için tek bir oturum açma çözümü sağlayarak anahtarlarınızı yüklemek için bir aracı oluşturmasını sağlar. makineleri. Bu rehber size bunu ayarlamada yol gösterecektir.

Bunun işe yarayacağını doğrulamamıştım.


0

Bunu ~/.bashrcdosyanıza ekleyin :

ssh-add -L|grep identities > /dev/null && ssh-add /path/to/ssh/private/key

Bunun, bir sonraki oturum açma işlemlerinde şifre sorulmamasıyla ilgili olan soruyla nasıl ilişkili olduğunu anlamıyorum.
Chris Down,

0

Bir (muhtemelen şifresiz) bir anahtar eklemek ve X'inssh-add altında çalışırken bile, ne olursa olsun, bir şifre sormamasını sağlamak için :

DISPLAY= ssh-add -k /path/to/key </dev/null &>/dev/null

Çıkış durumu başarı veya başarısızlığı gösterir.


0

Eğer şifre yöneticisi olarak denizatı kullanıyorsanız ...

Aradığınız hedefi gerçekleştiren bir diğer çözüm de, oturum açtıktan sonra otomatik olarak açmak için ssh anahtarlarını denizatıya eklemektir. Bunun en büyük yararı, gdm ile giriş yaptıktan sonra anahtarlar için asla bir şifre girmeniz gerekmemesi veya anahtarların şifresi olsa bile giriş yapmış olmanızdır. Bu, hem özel anahtarı hem de genel anahtarı GEREKTİRİR. Ayrıca denizatı için bir adlandırma kuralını izlemelidirler. Varsayılan değer kabul edilebilir (özel anahtar için id_rsa ve genel anahtar için id_rsa.pub ... Gerçekten privatekeyname ve privatekeyname.pub olan her şey )

Oturum açtıktan sonra otomatik kilit açma için denizatı ssh anahtarını eklemek; (fedora25'de, yolun diğer dağıtımlarda nerde olduğundan emin değilim, yine de çok benzer)

/lib64/seahorse/seahorse-ssh-askpass /path/to/keys/here

Benim için öyleydi

/lib64/seahorse/seahorse-ssh-askpass ~/.ssh/id_rsa

(denizatı otomatik olarak benim durumumdaki ortak anahtarın id_rsa.pub olduğunu varsayacaktır)

Komutu uyguladıktan sonra, denizatı özel anahtarın şifresini girmek için küçük bir gtk şifre alanı açacaktır. veya anahtarı parola olmadan oluşturduysanız boş bırakın.

Her şey yolunda giderse, Seahorse seni istemeyecek. Hedef makineye ssh girmeye çalışmanız gerekecek. O zaman denizatı sizden anahtarın şifresini şifreyle grafiksel olarak açmanızı isteyecektir (BU BİR SADECE OLACAKTIR), ancak bu sefer biraz farklı görünmelidir; ), ve oturum açtıktan sonra anahtarın kilidini açmak için SEÇENEK teklif ederseniz, hedefinize ulaşmak için bu seçeneği işaretlemelisiniz.

Sırf tüm cevapları okumadığım için, bu cevabı denemeden önce herkesin ssh-add ile yapmasını söylediklerini geri almanızı tavsiye ederim. Aksi taktirde anahtarlarınızda kötü bir şeyler olmasına neden olabilir, idk.


0

İşte kesin komut dosyası.

$ PASSW'ı güncelledikten sonra Terminalinize kopyalayıp yapıştırın

# <sshpass> via typinator
# Updated: 2017-01-18_21h36
#
# apt-get update -y; apt-get install expect -qy

# Pass this value to ssh-add
PASSW="myfancypass123"

# Define a name for this script
THIS_SCRIPT="$(date +%Y-%m-%d_%H-%M-%S-%N)".sh

# Create a fresh directory to work from / Clean up
rm -rf ~/temp; mkdir -p ~/temp; cd ~/temp; ls -la


# Output our bash script file - BEGIN
cat <<< '
#!/bin/bash

set -u     # Stop if an unbound variable is referenced
set -e     # Stop on first error
export HISTIGNORE="expect*";

# Normal CMDs
echo && echo "The process should take about 10 seconds:" && echo
eval "$(ssh-agent -s)"; sleep 0.5;

# Define VAR passed when this bash-script was launched
password="$@"

# Launch the expect magic
expect -c "
    spawn ssh-add /root/.ssh/id_rsa
    expect "?assword:"
    send \"$password\r\"
    expect "?password:"
    send \"$password\r\"
    expect eof"

export HISTIGNORE="";
export password="";
' > $THIS_SCRIPT
# Output our bash script file - END


# Ensure we are in the right path
cd ~/temp; ls -la; sleep 1;

# Run the bash script
chmod +x ./$THIS_SCRIPT; ./$THIS_SCRIPT "$PASSW"; unset password;

# Clean up
rm -rf ~/temp; mkdir -p ~/temp; cd ~/temp; ls -la

0

Farkında olduğum en iyi yol, önceki işten uyarladığım bir PAM giriş betiğini kullanmak, çünkü bu soruya tatmin edici bir cevap bulamadım.

Parolanız sistem şifreniz ve ağır bir türetme işlevi ile şifrelenmiş olarak saklanır. Giriş sırasında, sistem şifreniz parolanızın şifresini çözmek ve aracıya eklemek için kullanılır.

https://github.com/capocasa/systemd-user-pam-ssh

Sunulan diğer tüm çözümlere göre avantajı, güvenlik eşdeğerini ssh-add komutunu açılışta manuel olarak sıfır çabayla çalıştırma ile birleştirmesidir. Ekstra araç gerektirmez ve çoğu sistemde (OpenSSL) varsayılan olarak kurulu olan bir ekstra bağımlılığa sahiptir.


0

MacOS'taki kurulumum aşağıdaki gibidir (içinde .zshrcveya .bash_profilebash millet için):

# Kill then Load the ssh-agent and set the necessary env variables it outputs
sshRestart() {
    # if all else fails
    # pkill -u $(whoami) ssh-agent;

    if [ -n "$SSH_AUTH_SOCK" ] ; then
        eval `/usr/bin/ssh-agent -k`
    fi
    eval `ssh-agent -s`
    ssh-add ~/.ssh/YOUR_KEY_FILE
    echo "Restarted SSH agent"
}

if [ -z "$SSH_AUTH_SOCK" ] || [[ $SSH_AUTH_SOCK == *"/private/tmp/"* ]] ; then
    eval `ssh-agent -s` > /dev/null 2>&1
    ssh-add ~/.ssh/YOUR_KEY_FILE > /dev/null 2>&1
fi

|| [[ $SSH_AUTH_SOCK == *"/private/tmp/"* ]]Varsayılan değer olduğundan parçası MacOS üzerinde gereklidir /private/tmp/com.apple.launchd.SOMETHINGHERE/Listeners. Aksi halde, @Thomas Nyman'ın kapsamlı cevabı başarısız olur çünkü $SSH_AUTH_SOCKdaima bir şeye ayarlanmıştır.

Sonra da .zlogout(ya da .bash_logoutbash millet için):

if [ -n "$SSH_AUTH_SOCK" ] ; then
    eval `/usr/bin/ssh-agent -k`
fi

MacOS üzerinde test edildi Mojave 10.14.5

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.