Bir kez oturum açmak için Git'i SSH üzerinden yapılandırma


196

Git depomu ssh üzerinden klonladım. Bu yüzden, kaynak master ile iterek veya çekerek her iletişim kurduğumda, şifremi tekrar girmeliyim. Git'i şifremi birden çok kez girmem gerekmeyecek şekilde nasıl yapılandırabilirim?


7
Bir güvenlik sorunu gibi görünüyor, normal taahhütler için herhangi bir şifre kullanmanıza gerek yok, ancak bir itme, yeniden kimlik doğrulaması yapmak istediğiniz şey türüdür, ancak belki de eski modayım.
Alex Sexton

Yanıtlar:


104

Deneyin ssh-add, ssh-agentözel anahtarınızı çalıştırıyor ve tutmanız gerekiyor

(Tamam, güncellenen soruya yanıt olarak, önce Jefromi'nin açıkladığıssh-keygen gibi genel ve özel bir anahtar oluşturmak için çalışırsınız . Ortak anahtarı sunucuya koyarsınız. Bir ovanın eşdeğerine sahip değilseniz bir parola kullanmalısınız. -özel anahtarınızdaki metin şifresi.Ancak bunu yaptığınızda, aşağıda açıklandığı gibi pratik bir konuya ihtiyacınız vardır .)ssh-agent

Oturum açarken ssh-agentarka planda çalışıyor olmak istiyorsunuz. Giriş yaptıktan sonra fikir, ssh-addaracıya parolanızı vermek için anahtarınızı çözmek üzere bir kez ve yalnızca bir kez çalıştırmaktır . Ajan daha sonra anahtarın kilidi açık ve yüklü, her yerde ssh her zaman kullanıma hazır bellekte oturur.

Tüm ssh-family komutları 1 daha sonra aracıya danışacak ve otomatik olarak özel anahtarınızı kullanabilecektir.

OSX'te (err, macOS ), GNOME ve KDE sistemleri ssh-agentgenellikle sizin için otomatik olarak başlatılır. Benim gibi, bunun sizin için kesinlikle yapılmadığı bir Cygwin veya başka bir pencere ortamınız olması durumunda ayrıntıları inceleyeceğim.

Buradan başlayın: man ssh-agent.

Aracıyı otomatik olarak çalıştırmanın çeşitli yolları vardır. Man sayfasının açıkladığı gibi, giriş oturumunuzun diğer işlemlerinin bir üst öğesi olacak şekilde çalıştırabilirsiniz. Bu şekilde, sağladığı ortam değişkenleri otomatik olarak tüm kabuklarınızda olacaktır. (Daha sonra) çağırdığınızda ssh-addveya sshher ikisi de aracıya erişebileceğinden, hepsinde sihirli soket yol adlarına veya başka bir şeye sahip ortam değişkenleri vardır.

Alternatif olarak, aracıyı sıradan bir alt öğe olarak çalıştırabilir, ortam ayarlarını bir dosyaya kaydedebilir ve başladığında her kabukta bu dosyayı kaynaklayabilirsiniz.

OSX ve Ubuntu sistemlerim aracı başlatma kurulumunu otomatik olarak yapar, bu yüzden tek yapmam gereken bir ssh-addkez çalıştırmaktır . Koşmaya çalışın ssh-addve işe yarayıp yaramadığını görün, eğer öyleyse, bunu her yeniden başlatmada bir kez yapmanız yeterlidir.

Cygwin sistemimin manuel olarak yapılması gerekiyordu, bu yüzden bunu benim için yaptım .profileve .bashrckaynağım var .profile:

. .agent > /dev/null
ps -p $SSH_AGENT_PID | grep ssh-agent > /dev/null || {
        ssh-agent > .agent
        . .agent > /dev/null
}

.agentDosya komut dosyası tarafından otomatik olarak oluşturulur; çevre değişkenleri tanımlarını ve ihracatını içerir. Yukarıdaki .agent dosyasını kaynak yapmaya çalışır ve sonra ps(1)aracıya çalışır . Çalışmazsa, bir aracı başlatır ve yeni bir aracı dosyası oluşturur. Ayrıca sadece çalıştırabilirsiniz ssh-addve başarısız olursa bir ajan başlatın.


1. Ve hatta yerel ve uzak sudodoğru pam uzantısı ile.


1
ssh-agenteval `ssh-agent`
Kullanmak

288

HTTPS protokolü kullandığım için GitHub ile benzer bir sorun yaşadım. Hangi protokolü kullandığınızı kontrol etmek için

git config -l

ve ile başlayan satıra bakın remote.origin.url. Protokolünüzü değiştirmek için

git config remote.origin.url git@github.com:your_username/your_project.git

13
Bunun resmi cevap olması gerektiğini düşünüyorum, ^ 5 @Muein!
Fer Martin

14
repo özel olduğunda ve sahibi değilseniz bu çalışmaz. Sadece bir Permission deniedhatayla karşılaştım .
ogzd

7
Bu sadece bir repo içindir, küresel olarak nasıl yapabilirim?
onmyway133

2
@ogzd GitHub (veya hangi hizmeti kullanırsanız kullanın), bunun çalışması için genel SSH anahtarınıza ihtiyacı vardır, ancak bu yine de doğru çözümdür.
MattM

bir alternatifgit remote set-url origin git@github.com:your_username/your_project.git
icosamuel

25

Bu git'i değil ssh'yi yapılandırmakla ilgilidir. Henüz yapmadıysanız, ssh-keygenbir anahtar çifti oluşturmak için (boş bir parolayla) kullanmanız gerekir . Ardından, ortak anahtarı ile uzak hedefe kopyalayın ssh-copy-id. Birden fazla anahtara ihtiyacınız yoksa (örn. Başka amaçlar için parolaya sahip daha güvenli bir anahtar) veya devam eden gerçekten garip çok kimlikli şeyleriniz yoksa, bu basit:

ssh-keygen   # enter a few times to accept defaults
ssh-copy-id -i ~/.ssh/id_rsa user@host

Düzenleme: Gerçekten sadece DigitalRoss'un cevabını okumalısınız, ancak: parolaları olan anahtarlar kullanıyorsanız ssh-add <key-file>, bunları eklemek için kullanmanız gerekir ssh-agent(ve ssh-agentdağıtımınızın zaten bir tane yoksa bir tane açmanız gerekir).


2
Bunun soruyu cevapladığından emin değilim, bunu zaten yapmış olmalı ya da siteye ulaşamayacaktı. İhtiyacı olan cevap şudur: ssh-agentHer defasında parola girme sorusunu atlamak istediği için. Yanlış düşünmüyorum ama yanlış anlayan biri olmadıkça bu cevabı geliştirmeniz gerektiğini düşünüyorum ...
DigitalRoss

2
@DigitalRoss: Ah, OP anahtarları gerçekten ayarlamışsa soruyu okumaktan emin değildim. Muhtemelen haklısın ve kasten bir parola kullanmamaya çalışıyordum. Ancak, elbette haklısın ssh-agent. Sana +1!
Cascabel

Ssh-keygen veya ssh-add kullanmam gerekip gerekmediğime kafam karıştı. ~ / .Ssh / dizinimde yalnızca iki dosyam var: config ve bilinen_anahtarlar. Görünüşe göre ssh-add için başka bir dosya ~ / .ssh / id_rsa gerekiyor. Bu dosyayı ilk olarak @Jefromi'nin açıkladığı gibi ssh-keygen kullanarak mı oluşturmalıyım?
yeniden

Evet, anahtarı uzak sunucuya kopyalayabilmeniz için önce oluşturmanız gerekir. Sanırım belki de "parola" kelimesini kullanımınızla karıştırıldık - ssh-*anahtarı kullanmak için gereken parolayı çağıran - gerçekten uzaktan kumandadaki gerçek kullanıcı parolanızı kastettiğiniz yer bu?
Cascabel

Evet, parola yerine parola demeliydim.
yeniden

23

Depoyu klonladığınızda, bunu HTTPS ile değil SSH URL'si ile yaptığınızdan emin olun; repo'nun klon URL'si kutusunda, URL'yi kopyalamadan önce SSH protokolünü seçin. Aşağıdaki resme bakın:

resim açıklamasını buraya girin


23

HTTPS kullanarak klonladıysanız (önerilir) o zaman: -

git config --global credential.helper cache

ve sonra

git config --global credential.helper 'cache --timeout=2592000'
  • 30 gün (veya size uygun olanı) önbelleğe almayı etkinleştirmek için zaman aşımı = 2592000 (saniyede 30 Gün).

  • Şimdi kullanıcı adınızı ve şifrenizi gerektiren basit bir git komutunu çalıştırın.

  • Kimlik bilgilerinizi bir kez girin ve şimdi önbellekleme 30 Gün boyunca etkinleştirildi.

  • Herhangi bir git komutuyla tekrar deneyin ve artık herhangi bir kimlik bilgisine ihtiyacınız yok.

  • Daha fazla bilgi için: - GitHub parolanızı Git'te önbelleğe alma

Not : Kimlik bilgisi yardımcısını kullanmak için Git 1.7.10 veya daha yenisine ihtiyacınız vardır. Sistem yeniden başlatıldığında şifreyi tekrar girmemiz gerekebilir.


1
Bir kurtarıcısınız, her seferinde kullanıcı adı şifresi yazmaktan bıktınız. Teşekkürler :)
Dave Ranjan

lütfen bunun yalnızca Linux mu yoksa yalnızca Windows mu yoksa her ikisi için mi olduğunu belirtin.
joedotnot

@joedotnot tüm işletim sistemleri için. Ayrıca, söz konusu bağlantıya göz atabilir ve başlığın hemen altında OS seçeneğini bulacaksınız.
Nishant Thapliyal

Bu! Her durumda çalışır.
Akaisteph7

@Charles Merhaba, Ben sadece aynı test ve beklendiği gibi çalışıyor.
Nishant Thapliyal

8

Git-bash veya terminalde çalışan komutlar üzerinden dosyaları doğrudan düzenlemeyi tercih edenler için Muein'in düşüncelerini genişletmek.

Projenizin .git dizinine gidin (yerel makinenizdeki proje kökü) ve 'config' dosyasını açın. Ardından [uzak "başlangıç ​​noktası" için arama yapın ve url yapılandırmasını aşağıdaki gibi ayarlayın:

[remote "origin"]
    #the address part will be different depending upon the service you're using github, bitbucket, unfuddle etc.
    url = git@github.com:<username>/<projectname>.git

1
Bu gerçekten yardımcı oldu. Sorunu çözmek için güvenli ve temiz bir yol. Sanırım birisi Muein'in bununla olan cevabını geliştirmeli.
Luis Ortega Araneda

1
"Projenizin .git dizinine gidin" ilk kez
deneniyor

Bu hatayı alıyorum "ölümcül: 'git@github.com: <username> / https' protokolünü kullanmıyorum"
Shivam Bharadwaj

@ ShivamBharadwaj hızlı bir arama bu konu stackoverflow.com/questions/30474447/… ortaya çıktı . Git klon komutunu bazı web sitelerinden kopyalayıp bu sorunla karşılaşma olasılığınız var mı? Evetse, bunun yerine komutun tamamını yazmayı deneyin.
uchamp

6

Burada iki farklı şey olduğunu düşünüyorum. Birincisi, normal SSH kimlik doğrulamasının kullanıcının hesabın şifresini koymasını gerektirmesidir (burada hesap şifresinin sshd yapılandırmasına bağlı olarak farklı yöntemlere göre kimlik doğrulaması yapılacaktır).

Sertifikaları kullanarak bu şifreyi koymaktan kaçınabilirsiniz. Sertifikalarda hala bir parola girmeniz gerekir, ancak bu kez özel anahtarınızın parolasıdır (bu, hesabın parolasından bağımsızdır).

Bunu yapmak için steveth45 tarafından belirtilen talimatları takip edebilirsiniz:

İle Açık Anahtar Kimlik Doğrulaması .

Sertifikanın parolasını her seferinde koymaktan kaçınmak istiyorsanız, DigitalRoss tarafından işaret edildiği gibi ssh-agent'ı kullanabilirsiniz.

Bunu tam olarak Unix'e karşı Windows'a bağlıdır, ancak esas olarak oturum açtığınızda arka planda ssh-agent'ı çalıştırmanız gerekir ve daha sonra ilk kez giriş yaptığınızda, ajana parolanızı vermek için ssh-add komutunu çalıştırın. Tüm ssh-family komutları aracıya danışacak ve parolanızı otomatik olarak alacaktır.

Buradan başlayın: man ssh-agent.

Ssh-agent'ın tek sorunu, en azından * nix'de sertifika parolasını her yeni kabuğa koymanız gerektiğidir. Ve sonra sertifika "yüklenir" ve herhangi bir şifre koymadan ssh sunucusunda kimlik doğrulaması yapmak için kullanabilirsiniz. Ama bu o kabukta.

Anahtarlık ile ssh-agent ile aynı şeyi yapabilirsiniz, ancak "sistem çapında". Bilgisayarınızı açtıktan sonra bir kabuk açar ve sertifikanın şifresini koyarsınız. Ve sonra, diğer tüm kabuklar bu "yüklü" sertifikayı kullanır ve siz bilgisayarınızı yeniden başlatana kadar şifreniz bir daha sorulmaz.

Gnome, Gnome Keyring adında , ilk kez kullandığınızda sertifikanızın şifresini soran benzer bir uygulamaya sahiptir ve daha sonra güvenli bir şekilde saklar, böylece tekrar sorulmaz.


Kendimi anahtarlık kullanıyorum : çok kullanışlı.
Jakub Narębski

AddKeysToAgent yes.ssh / config yazmanın bir yolu daha vardır . Daha sonra bilgisayarı
kapatana


4
ssh-keygen -t rsa

Bir parola istendiğinde boş bırakın, yani enter tuşuna basın. kadar basit!!


4
Bunu yaparsanız, geliştirme istemcinize erişimi olan herkesin bir parolaya ihtiyaç duymadan depo sunucusuna erişebileceğini unutmayın. Ssh-agent / ssh-add combo çok daha iyi güvenlik sağlar.
Peter V. Mørch

3

Bunu ittiğiniz kutudan deneyin

    ssh git@github.com

Daha sonra github'dan hoş bir yanıt almalısınız ve sonra itmek için iyi olacaksınız.


2
Benim için çalışıyor Hi gkucmierz! You've successfully authenticated, but GitHub does not provide shell access.ama itmeye çalıştığımda bir şekilde git hala bana şifre sor
gkucmierz

2

Ben giriş vie ssh anahtarına izin vermedi bir sunucudan git repo klonlamak zorunda kaldı ama sadece bir kullanıcı / şifre ile. Git Plugin'i basit bir kullanıcı / parola kombinasyonu kullanacak şekilde yapılandırmanın bir yolunu bulamadım.

ŞİFRENİZ JENKINS İŞİNİN YAPILANDIRILMASINDA VE GÜNLÜĞÜNDE TEMİZ METİN OLARAK GÖSTERİLDİĞİNDE BU SORUNU ÇÖZME İYİ BİR YOLU DEĞİLDİR! SADECE RSA-ANAHTAR DOĞRULAMA YA DA DİĞER YAPILANDIRMA OLANAKLARINI YAPILANDIRMAK YOKTUR!

rm -rf $WORKSPACE &&
expect -c 'set timeout -1; spawn git clone USER@MYHOST:/MYPATH/MYREPO.git $WORKSPACE; expect "password:" {send "MYPASSWORD\r"}; expect eof'

1

AddKeysToAgent yes.Ssh / config dosyasının üstüne tek bir satır ekleyin . Tabii ssh-agent önceden çalışıyor olmalı. Çalışmıyorsa (kontrol edin prep ssh-agent), sadece çalıştırıneval $(ssh-agent)

Şimdi, anahtar sistem çapında belleğe yüklenir ve parolayı tekrar yazmak zorunda kalmazsınız.

Çözümün kaynağı /ubuntu/362280/enter-ssh-passphrase-once/853578#853578


0

Ben Windows üzerinde ssh kullanıyorum çünkü ben de her zaman parola yazmaktan kaçınmak için çalışıyor. Yaptığım şey .profile dosyamı değiştirmekti, böylece parolamı belirli bir oturumda girdim. İşte kodun bir parçası:

    SSH_ENV="$HOME/.ssh/environment"

    # start the ssh-agent
    function start_agent {
        echo "Initializing new SSH agent..."
        # spawn ssh-agent
        ssh-agent | sed 's/^echo/#echo/' > "$SSH_ENV"
        echo succeeded
        chmod 600 "$SSH_ENV"
        . "$SSH_ENV" > /dev/null
        ssh-add
    }

    # test for identities
    function test_identities {
        # test whether standard identities have been added to the agent already
        ssh-add -l | grep "The agent has no identities" > /dev/null
        if [ $? -eq 0 ]; then
            ssh-add
            # $SSH_AUTH_SOCK broken so we start a new proper agent
            if [ $? -eq 2 ];then
                start_agent
            fi
        fi
    }

    # check for running ssh-agent with proper $SSH_AGENT_PID
    if [ -n "$SSH_AGENT_PID" ]; then
        ps -fU$USER | grep "$SSH_AGENT_PID" | grep ssh-agent > /dev/null
        if [ $? -eq 0 ]; then
      test_identities
        fi
    # if $SSH_AGENT_PID is not properly set, we might be able to load one from
    # $SSH_ENV
    else
        if [ -f "$SSH_ENV" ]; then
      . "$SSH_ENV" > /dev/null
        fi
        ps -fU$USER | grep "$SSH_AGENT_PID" | grep ssh-agent > /dev/null
        if [ $? -eq 0 ]; then
            test_identities
        else
            start_agent
        fi
    fi

yani bu ile benim oturumda bir kez parolamı yazın ..


-1

Tüm bu önerileri ve daha fazlasını denedim, sadece AWS örneğimden klonla gidebilirim. Hiçbir şey çalışmadı. Sonunda çaresizlikten dolandım: Yerel makinemde id_rsa.pub içeriğini kopyaladım ve AWS örneğimde ~ / .ssh / known_hosts'a ekledim.


1
~ / .Ssh / yetkili_anahtarlar demek istemediğinizden emin misiniz?
Kevin_Kinsey
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.