Mengkonfigurasi Git melalui SSH untuk masuk sekali

195

Saya telah mengkloning repositori git saya ke ssh. Jadi, setiap kali saya berkomunikasi dengan master asal dengan mendorong atau menarik, saya harus memasukkan kembali kata sandi saya. Bagaimana saya bisa mengkonfigurasi git sehingga saya tidak perlu memasukkan kata sandi saya beberapa kali?

pemrogram ulang
sumber
7
Sepertinya masalah keamanan, Anda tidak harus menggunakan kata sandi apa pun untuk melakukan komitmen normal, tetapi dorongan adalah jenis hal yang ingin Anda otentikasi ulang, tapi mungkin saya kuno.
Alex Sexton

Jawaban:

104

Coba ssh-add, Anda harus ssh-agentmenjalankan dan menahan kunci pribadi Anda

(Ok, menanggapi pertanyaan yang diperbarui, Anda pertama kali menjalankan ssh-keygenuntuk menghasilkan kunci publik dan pribadi seperti yang dijelaskan Jefromi . Anda meletakkan kunci publik di server. Anda harus menggunakan kata sandi, jika Anda tidak memiliki padanan kata yang sama -text password di kunci pribadi Anda. Tetapi ketika Anda melakukannya, maka Anda perlu sebagai hal praktis seperti yang dijelaskan di bawah ini.)ssh-agent

Anda ingin menjalankan ssh-agentdi latar belakang saat Anda masuk. Setelah Anda masuk, idenya adalah untuk menjalankanssh-add sekali dan hanya sekali, untuk memberikan agen frasa sandi Anda, untuk memecahkan kode kunci Anda. Agen kemudian hanya duduk di memori dengan kunci Anda dibuka dan dimuat, siap digunakan setiap kali Anda ssh di suatu tempat.

Semua perintah ssh-family 1 kemudian akan berkonsultasi dengan agen dan secara otomatis dapat menggunakan kunci pribadi Anda.

Pada sistem OSX (err, macOS ), GNOME dan KDE, ssh-agentbiasanya diluncurkan secara otomatis untuk Anda. Saya akan membahas rinciannya, seperti saya, Anda juga memiliki lingkungan Cygwin atau jendela lain di mana ini pasti tidak dilakukan untuk Anda.

Mulai di sini: man ssh-agent .

Ada berbagai cara untuk menjalankan agen secara otomatis. Seperti yang dijelaskan oleh halaman manual, Anda dapat menjalankannya sehingga merupakan induk dari semua proses login Anda yang lain. Dengan begitu, variabel lingkungan yang disediakannya akan secara otomatis berada di semua shell Anda. Ketika Anda (nanti) memohon ssh-addataussh keduanya akan memiliki akses ke agen karena mereka semua memiliki variabel lingkungan dengan nama path soket ajaib atau apa pun.

Atau, Anda dapat menjalankan agen sebagai anak biasa, menyimpan pengaturan lingkungan dalam file, dan sumber file itu di setiap shell ketika dimulai.

Sistem OSX dan Ubuntu saya secara otomatis melakukan pengaturan peluncuran agen, jadi yang harus saya lakukan adalah menjalankannya ssh-addsekali. Coba jalankan ssh-adddan lihat apakah itu berfungsi, jika demikian, maka Anda hanya perlu melakukannya sekali per reboot.

Sistem Cygwin saya membutuhkannya dilakukan secara manual, jadi saya melakukan ini di saya .profiledan saya memiliki .bashrcsumber .profile:

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

The .agentfile yang dibuat secara otomatis oleh script; ini berisi definisi variabel lingkungan dan ekspor. Di atas mencoba untuk sumber file .agent, dan kemudian mencoba ke ps(1)agen. Jika tidak berhasil, ia memulai agen dan membuat file agen baru. Anda juga dapat menjalankan ssh-adddan jika gagal memulai agen.


1. Dan bahkan lokal dan jarak jauh sudodengan ekstensi pam yang tepat.

DigitalRoss
sumber
1
Daripada sumber output dari ssh-agentitu mungkin lebih baik untuk digunakan:eval `ssh-agent`
scottsome
285

Punya masalah serupa dengan GitHub karena saya menggunakan protokol HTTPS. Untuk memeriksa protokol apa yang Anda gunakan jalankan saja

git config -l

dan lihat garis yang dimulai dengan remote.origin.url. Untuk beralih protokol Anda

git config remote.origin.url [email protected]:your_username/your_project.git
Muein Muzamil
sumber
12
Saya pikir ini harus menjadi jawaban resmi, ^ 5 @Muein!
Fer Martin
14
ini tidak berfungsi ketika repo bersifat pribadi dan Anda bukan pemiliknya. Saya baru saja dihadapkan pada Permission deniedkesalahan.
ogzd
7
Ini hanya untuk satu repo, bagaimana saya bisa membuatnya secara global?
onmyway133
2
@ogzd GitHub (atau layanan apa pun yang Anda gunakan) membutuhkan kunci SSH publik Anda sebelum ini berfungsi, tetapi ini masih merupakan solusi yang tepat.
MattM
alternatifnya adalahgit remote set-url origin [email protected]:your_username/your_project.git
icosamuel
24

Ini tentang mengkonfigurasi ssh, bukan git. Jika Anda belum melakukannya, Anda harus menggunakan ssh-keygen(dengan frasa sandi kosong) untuk membuat pasangan kunci. Kemudian, Anda menyalin kunci publik ke tujuan jarak jauh dengan ssh-copy-id. Kecuali Anda memerlukan beberapa kunci (mis. Yang lebih aman dengan frasa sandi untuk keperluan lain) atau Anda memiliki beberapa hal identitas ganda yang benar-benar aneh, ini sederhana:

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

Sunting: Anda harus benar-benar hanya membaca jawaban DigitalRoss, tetapi: jika Anda menggunakan kunci dengan frasa sandi, Anda harus menggunakan ssh-add <key-file>untuk menambahkannya ssh-agent(dan jelas memulai sebuah ssh-agentjika distribusi Anda belum memiliki satu berjalan untuk Anda).

Cascabel
sumber
2
Saya tidak yakin ini menjawab pertanyaan, dia pasti sudah melakukan itu atau dia tidak akan dapat mencapai situs. Jawaban yang ia butuhkan adalah:, ssh-agentkarena ia ingin mem-bypass masalah pass-frasa-setiap-kali. Tidak downvoting tapi saya pikir Anda perlu meningkatkan jawaban ini, kecuali saya orang yang salah paham ...
DigitalRoss
2
@DigitalRoss: Ah, saya tidak yakin membaca pertanyaan apakah OP benar-benar telah mengatur kunci. Anda mungkin benar, dan saya sengaja mencoba menyarankan agar tidak menggunakan kata sandi. Namun, Anda tentu saja benar ssh-agent. Memberi +1 kepada Anda!
Cascabel
Saya bingung apakah saya perlu menggunakan ssh-keygen atau ssh-add. Dalam direktori ~ / .ssh / saya hanya punya dua file: config dan known_hosts. Tampaknya ssh-add memerlukan file lain ~ / .ssh / id_rsa. Haruskah saya membuat file itu terlebih dahulu menggunakan ssh-keygen seperti yang dijelaskan @Jefromi?
Pemrogram ulang
Ya, Anda harus membuat kunci sebelum dapat menyalinnya ke server jarak jauh. Saya pikir mungkin kita bingung dengan penggunaan kata "passphrase" Anda - itulah yang ssh-*menyebut kata sandi yang diperlukan untuk menggunakan kunci - di mana Anda benar-benar bermaksud menggunakan kata sandi pengguna aktual di remote?
Cascabel
Ya, saya seharusnya mengatakan kata sandi alih-alih frasa sandi.
Pemrogram ulang
23

Pastikan bahwa ketika Anda mengkloning repositori, Anda melakukannya dengan URL SSH dan bukan HTTPS; di kotak URL klon repo, pilih protokol SSH sebelum menyalin URL. Lihat gambar di bawah ini:

masukkan deskripsi gambar di sini

Zorayr
sumber
23

Jika Anda telah dikloning menggunakan HTTPS (disarankan) maka: -

git config --global credential.helper cache

lalu

git config --global credential.helper 'cache --timeout=2592000'
  • batas waktu = 2592000 (30 Hari dalam detik) untuk mengaktifkan caching selama 30 hari (atau apa pun yang cocok untuk Anda).

  • Sekarang jalankan perintah git sederhana yang membutuhkan nama pengguna dan kata sandi Anda.

  • Masukkan kredensial Anda sekali dan sekarang caching diaktifkan selama 30 Hari.

  • Coba lagi dengan perintah git dan sekarang Anda tidak memerlukan kredensial.

  • Untuk info lebih lanjut: - Caching kata sandi GitHub Anda di Git

Catatan : Anda perlu Git 1.7.10 atau yang lebih baru untuk menggunakan pembantu kredensial. Pada sistem restart, kita mungkin harus memasukkan kata sandi lagi.

Nishant Thapliyal
sumber
1
Anda adalah penyelamat, sudah bosan mengetik kata sandi nama pengguna setiap kali. Terima kasih :)
Dave Ranjan
tolong sebutkan apakah ini hanya untuk Linux atau hanya Windows atau keduanya.
joedotnot
@joedotnot untuk semua OS. Anda juga dapat menelusuri tautan yang disebutkan dan di sana Anda akan menemukan opsi OS tepat di bawah tajuk.
Nishant Thapliyal
Ini! Bekerja dalam setiap kasus.
Akaisteph7
@ Charles Hai, Saya baru saja menguji yang sama dan berfungsi seperti yang diharapkan.
Nishant Thapliyal
8

Memperluas pemikiran Muein bagi mereka yang lebih memilih untuk mengedit file langsung daripada menjalankan perintah di git-bash atau terminal.

Buka direktori .git proyek Anda (root proyek pada mesin lokal Anda) dan buka file 'config'. Kemudian cari [remote "origin"] dan atur konfigurasi url sebagai berikut:

[remote "origin"]
    #the address part will be different depending upon the service you're using github, bitbucket, unfuddle etc.
    url = [email protected]:<username>/<projectname>.git
uchamp
sumber
1
Ini sangat membantu. Cara aman dan bersih untuk memperbaiki masalah. Saya pikir seseorang harus meningkatkan jawaban Muein dengan yang ini.
Luis Ortega Araneda
1
"Pergi ke direktori .git proyek Anda" mencoba pertama kali
amuliar
Mendapat kesalahan ini "fatal: Saya tidak menangani protokol '[email protected]: <username> / https'"
Shivam Bharadwaj
@ShivamBharadwaj pencarian cepat mengungkapkan utas ini stackoverflow.com/questions/30474447/… . Apakah ada kemungkinan Anda menyalin perintah git clone dari beberapa situs web dan mengalami masalah ini? Jika ya, maka coba ketikkan perintah lengkap sebagai gantinya.
uchamp
6

Saya pikir ada dua hal yang berbeda di sini. Yang pertama adalah bahwa otentikasi SSH normal mengharuskan pengguna untuk memasukkan kata sandi akun (di mana kata sandi akun akan diautentikasi terhadap metode yang berbeda, tergantung pada konfigurasi sshd).

Anda dapat menghindari memasukkan kata sandi itu menggunakan sertifikat. Dengan sertifikat Anda masih harus memasukkan kata sandi, tetapi kali ini adalah kata sandi kunci pribadi Anda (yang tidak tergantung pada kata sandi akun).

Untuk melakukan ini, Anda dapat mengikuti instruksi yang ditunjukkan oleh steveth45:

Dengan Otentikasi Kunci Publik .

Jika Anda ingin menghindari memasukkan kata sandi sertifikat setiap kali, maka Anda dapat menggunakan ssh-agent, seperti yang ditunjukkan oleh DigitalRoss

Cara tepat Anda melakukan ini tergantung pada Unix vs Windows, tetapi pada dasarnya Anda perlu menjalankan ssh-agent di latar belakang saat Anda masuk, dan kemudian saat pertama kali Anda masuk, jalankan ssh-add untuk memberikan kata sandi Anda kepada agen tersebut. Semua perintah ssh-family kemudian akan berkonsultasi dengan agen dan secara otomatis mengambil kata sandi Anda.

Mulai di sini: man ssh-agent.

Satu-satunya masalah ssh-agent adalah, setidaknya pada * nix, Anda harus meletakkan kata sandi sertifikat pada setiap shell baru. Dan kemudian sertifikat "dimuat" dan Anda dapat menggunakannya untuk mengotentikasi terhadap server ssh tanpa memasukkan kata sandi apa pun. Tapi ini ada di shell tertentu.

Dengan gantungan kunci, Anda dapat melakukan hal yang sama dengan ssh-agent tetapi "seluruh sistem". Setelah Anda menyalakan komputer Anda, Anda membuka shell dan memasukkan kata sandi sertifikat. Dan kemudian, setiap shell lain akan menggunakan sertifikat "dimuat" itu dan kata sandi Anda tidak akan pernah ditanyakan lagi sampai Anda me-restart PC Anda.

Gnome memiliki aplikasi serupa, bernama Gnome Keyring yang meminta kata sandi sertifikat Anda saat pertama kali menggunakannya dan kemudian menyimpannya dengan aman sehingga Anda tidak akan ditanya lagi.

Gaston
sumber
Saya menggunakan gantungan kunci sendiri: sangat berguna.
Jakub Narębski
ada satu cara lagi dengan menulis AddKeysToAgent yesdi .ssh / config. Kemudian dimuat dalam memori sampai Anda mematikan komputer
infoclogged
4

Jika Anda menggunakan github, mereka memiliki tutorial yang sangat bagus yang menjelaskannya dengan lebih jelas (setidaknya bagi saya).

http://help.github.com/set-up-git-redirect/

Miles
sumber
4
ssh-keygen -t rsa

Ketika ditanya frasa sandi, biarkan kosong yaitu, cukup tekan enter. sesimpel itu!!

Srinivas Kattimani
sumber
4
Ketahuilah bahwa jika Anda melakukan ini, maka siapa pun yang memiliki akses ke klien pengembangan Anda memiliki akses ke server repositori tanpa perlu kata sandi. Combo ssh-agent / ssh-add memberikan keamanan yang jauh lebih baik.
Peter V. Mørch
3

Coba ini dari kotak tempat Anda mendorong

    ssh [email protected]

Anda kemudian harus mendapatkan respons sambutan dari github dan akan baik-baik saja untuk kemudian mendorong.

toonsend
sumber
2
Ini bekerja untuk saya, Hi gkucmierz! You've successfully authenticated, but GitHub does not provide shell access.tetapi entah bagaimana git masih meminta saya kata sandi ketika saya mencoba untuk mendorong
gkucmierz
2

Saya harus mengkloning git repo dari server yang tidak mengizinkan kunci login vie ssh tetapi hanya dengan pengguna / kata sandi. Saya tidak menemukan cara untuk mengkonfigurasi Git Plugin untuk menggunakan kombinasi pengguna / kata sandi yang sederhana jadi saya menambahkan perintah shell berikut sebagai langkah pra-bangun pada mesin linux build yang tergantung pada perkakas yang diharapkan (apt-get install expect):

INI BUKAN CARA YANG BAIK UNTUK MEMECAHKAN MASALAH INI SEBAGAI PASSWORD ANDA DITAMPILKAN SEBAGAI TEKS CLEAR DALAM KONFIGURASI DAN LOG JOB JENKINS! HANYA MENGGUNAKANNYA JIKA TIDAK ADA CARA UNTUK MENGONFILMASI OTENTIFIKASI RSA-KEY ATAU KEMUNGKINAN KONFIGURASI LAINNYA!

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

Tambahkan satu baris AddKeysToAgent yesdi bagian atas file .ssh / config. Ofcourse ssh-agent harus berjalan sebelumnya. Jika tidak berjalan (centang oleh prep ssh-agent), cukup jalankan sajaeval $(ssh-agent)

Sekarang, kuncinya dimuat ke seluruh sistem ke dalam memori dan Anda tidak perlu mengetikkan frasa sandi lagi.

Sumber solusinya adalah /ubuntu/362280/enter-ssh-passphrase-once/853578#853578

infoclogged
sumber
0

Saya telah mencoba untuk menghindari mengetikkan frasa sandi sepanjang waktu juga karena saya menggunakan ssh di windows. Apa yang saya lakukan adalah memodifikasi file .profile saya, sehingga saya memasukkan frasa sandi saya di sesi tertentu. Jadi ini adalah bagian dari kode:

    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

jadi dengan ini saya mengetikkan frasa sandi saya sekali dalam satu sesi ..

David Blay
sumber
-1

Saya mencoba semua saran ini dan banyak lagi, supaya saya bisa mendapatkan klon dari AWS saya. Tidak ada yang berhasil. Saya akhirnya berselingkuh karena putus asa: Saya menyalin isi id_rsa.pub di mesin lokal saya dan menambahkannya ke ~ / .ssh / known_hosts pada contoh AWS saya.

alansendgi
sumber
1
Apakah Anda yakin tidak bermaksud ~ / .ssh / otor_keys?
Kevin_Kinsey