Bagaimana mencegah kata sandi untuk mendekripsi kunci pribadi harus dimasukkan setiap kali ketika menggunakan Git Bash di Windows?

125

Saya memiliki layanan bangunan otomatis yang mengunduh dari repositori pribadi git. Masalahnya adalah ketika mencoba mengkloning repositori, ia perlu memberikan kata sandi, karena tidak diingat; jadi karena tidak ada interaksi manusia, ia menunggu kata sandi selamanya. Bagaimana saya bisa memaksanya mengingat dari id_rsa.pub?

D. Giunchi
sumber

Jawaban:

255

Untuk pengguna Windows, cukup perhatikan bahwa ini adalah cara saya mengatur lingkungan Git Bash untuk masuk sekali ketika saya memulai. Saya mengedit ~/.bashrcfile saya :

eval `ssh-agent`
ssh-add

Jadi ketika saya memulai Git Bash, sepertinya:

Welcome to Git (version 1.7.8-preview20111206)
(etc)
Agent pid 3376
Enter passphrase for /c/Users/starmonkey/.ssh/id_dsa:
Identity added: /c/Users/starmonkey/.ssh/id_dsa (/c/Users/starmonkey/.ssh/id_dsa)

Dan sekarang saya bisa ssh ke server lain tanpa login setiap waktu.

starmonkey
sumber
9
Jika Anda tidak memiliki file ~ / .bashrc maka buat saja file teks baru (notepad atau editor lain) dan tambahkan dua baris yang disebut starmonkey.
pbz
7
'~' merujuk ke "direktori home" Anda. Di Windows, Anda dapat menemukan ini dengan membuka shell perintah (cmd) dan mengetik "echo% USERPROFILE%".
Hawkeye Parker
14
Bagi saya sintaks ini tidak berfungsi. Saya harus menulis eval $(ssh-agent)sebagai gantinya.
bentrok
1
Masalah saya adalah bahwa saya perlu menentukan file untuk ssh-add untuk digunakan. Mungkin karena saya memiliki lebih dari satu dan tidak menggunakan nama default. Contohssh-add ~/.ssh/myfile_rsa
Kesalahan Sintaks
1
copy > ~/.bashrcdi git bash untuk membuat file bashrc di windows, abaikan kesalahan
Ruben
61

Jawaban ini menjelaskan cara mendapatkan nama pengguna dan kata sandi GitHub untuk disimpan secara permanen, bukan frasa sandi kunci SSH.

Di Windows, jalankan saja

$ git config --global credential.helper wincred

Ini berarti bahwa lain kali Anda mendorong, Anda akan memasukkan nama pengguna dan kata sandi Anda seperti biasa, tetapi mereka akan disimpan dalam kredensial Windows. Anda tidak harus memasukkannya lagi, setelah itu.

Seperti di, Push to GitHub tanpa memasukkan nama pengguna dan kata sandi setiap saat (Git Bash di Windows) .

Stephen Tun Aung
sumber
2
setelah perintah ini, Anda perlu mengetikkan nama pengguna dan kata sandi Anda.
Stephen Tun Aung
5
Apakah ini berkaitan dengan kunci SSH, atau hanya otentikasi HTTPS (nama pengguna & kata sandi)? Pertanyaannya tampaknya tentang menggunakan kunci SSH.
Sean
Bekerja dengan sempurna untuk saya, saya kira saya menggunakan otentikasi HTTPS (nama pengguna & kata sandi).
Jonatan
Menjalankan ini tidak menghasilkan output sama sekali.
user9993
@ user9993 Tidak akan. Ini adalah perubahan konfigurasi, jadi sementara tidak ada output akan dibuat, gitakan mengubah perilakunya sesuai dengan set konfigurasi direktif.
starbeamrainbowlabs
9

Saya lebih suka tidak harus mengetikkan frasa sandi SSH saya ketika membuka terminal baru; sayangnya solusi starmonkey membutuhkan kata sandi yang harus diketik untuk setiap sesi. Sebaliknya, saya memiliki ini di .bash_profilefile saya :

# Note: ~/.ssh/environment should not be used, as it
#       already has a different purpose in SSH.

env=~/.ssh/agent.env

# Note: Don't bother checking SSH_AGENT_PID. It's not used
#       by SSH itself, and it might even be incorrect
#       (for example, when using agent-forwarding over SSH).

agent_is_running() {
    if [ "$SSH_AUTH_SOCK" ]; then
        # ssh-add returns:
        #   0 = agent running, has keys
        #   1 = agent running, no keys
        #   2 = agent not running
        ssh-add -l >/dev/null 2>&1 || [ $? -eq 1 ]
    else
        false
    fi
}

agent_has_keys() {
    ssh-add -l >/dev/null 2>&1
}

agent_load_env() {
    . "$env" >/dev/null
}

agent_start() {
    (umask 077; ssh-agent >"$env")
    . "$env" >/dev/null
}

if ! agent_is_running; then
    agent_load_env
fi

# If your keys are not stored in ~/.ssh/id_rsa or ~/.ssh/id_dsa, you'll need
# to paste the proper path after ssh-add
if ! agent_is_running; then
    agent_start
    ssh-add
elif ! agent_has_keys; then
    ssh-add
fi

unset env

Ini akan mengingat frasa sandi saya untuk sesi terminal baru juga; Saya hanya perlu mengetikkannya sekali ketika saya membuka terminal pertama saya setelah booting.

Saya ingin menghargai di mana saya mendapatkan ini; ini adalah modifikasi dari karya orang lain, tetapi saya tidak ingat dari mana asalnya. Terima kasih penulis anonim!

Pembaruan 2019-07-01: Saya rasa semua ini tidak perlu. Saya sekarang secara konsisten menjalankan ini dengan memastikan .bash_profilefile saya menjalankan ssh-agent:

eval $(ssh-agent)

Lalu saya mengatur sshfile konfigurasi seperti ini:

touch ~/.ssh/config
chmod 600 ~/.ssh/config
echo 'AddKeysToAgent yes' >> ~/.ssh/config
Conan
sumber
Saya masih dimintai kata sandi setiap saat.
Ryan
1
@Ryan semoga pembaruan yang baru saja saya tambahkan akan mengatasi masalah Anda. Saya terus memperbarui info dalam posting blog di conan.is/blogging/clojure-on-windows.html , dan saya mengajukan pertanyaan yang sama sendiri di stackoverflow.com/questions/52423626/…
Conan
Terima kasih, saya akan memeriksanya.
Ryan
@ Conan Solusi yang diperbarui berfungsi per sesi bash. Setelah saya menutup sesi bash saya dan membuka yang baru, saya kembali diminta untuk memasukkan kata sandi.
Tushar Raj
5

Jika saya memahami pertanyaan dengan benar, Anda sudah menggunakan kunci SSH resmi di layanan build, tetapi Anda ingin menghindari keharusan mengetikkan frasa sandi untuk setiap klon?

Saya dapat memikirkan dua cara untuk melakukan ini:

  1. Jika layanan build Anda dimulai secara interaktif: Sebelum Anda memulai layanan build, mulailah ssh-agentdengan batas waktu ( -topsi) yang cukup panjang . Kemudian gunakan ssh-add(msysGit seharusnya memiliki itu) untuk menambahkan semua kunci pribadi yang Anda butuhkan sebelum Anda memulai layanan membangun Anda. Anda masih harus mengetikkan semua kata sandi, tetapi hanya sekali per peluncuran layanan.

  2. Jika Anda ingin menghindari mengetikkan kata sandi sama sekali, Anda selalu dapat menghapus kata sandi dari kunci SSH, seperti yang dijelaskan dalam /server/50775/how-do-i-change-my- private-key-passphrase , dengan menetapkan passphrase baru yang kosong. Ini seharusnya menghilangkan prompt kata sandi sepenuhnya, tetapi bahkan lebih tidak aman daripada opsi sebelumnya.

millimoose
sumber
Terima kasih untuk opsi ke-2, saya membutuhkannya.
Stanislav Verjikovskiy
1

Ketika saya mencoba untuk mendorong kode saya, saya mendapatkan kesalahan di bawah ini:

$ git push origin dev

remote: Too many invalid password attempts. Try logging in through the website with your password.
fatal: unable to access 'https://[email protected]/xxxx/xxxx-api.git/': The requested URL returned error: 403

Setelah beberapa jam penelitian, saya menemukan saya perlu menggunakan perintah di bawah ini:

$ git config --global credential.helper cache

Setelah menjalankan perintah di atas, saya mendapatkan prompt untuk memasukkan nama pengguna dan kata sandi GitHub saya. Setelah memberikan kredensial yang benar, saya dapat mendorong kode saya.

Naushad Qamar
sumber
"Git: 'credential-cache' yang baru saja dihasilkan ini bukan perintah git." Namun "git config --global credential.helper store" berhasil - ini mungkin bukan yang terbaik, tapi saya terpaksa menggunakan HTTPS daripada SSH pilihan saya dan hanya ingin itu berfungsi.
Terry Brown
0

Solusi yang tepat adalah:

  1. Jalankan terminal default Windows - cmd dan dapatkan direktori profil master Anda

    echo %USERPROFILE%
    
  2. Jalankan Git Bash di direktori di atas dan buat .bashrcfile dengan perintah

    echo "" > .bashrc
    
  3. Buka .bashrcfile dengan editor teks favorit Anda dan tempel kode dari Bantuan GitHub ke file itu:

    env=~/.ssh/agent.env
    ...
    COPY WHOLE CODE FROM URL - I can't add it to Stack Overflow because it breaks layout... OMG!
    
  4. Mulai ulang Git Bash dan meminta kata sandi Anda (hanya pertama kali) dan selesai. Tidak ada kata sandi yang mengganggu lagi.

Manic Depression
sumber
-1

Anda perlu membuat authorized_keysfile di bawah .sshfolder pengguna di mana Anda akan terhubung ke server repositori. Misalnya, dengan asumsi Anda menggunakan nama pengguna buildservicepada repo.serverAnda dapat menjalankan:

cd ~buidservice
mkdir ./ssh
cat id_rsa.pub >> .ssh/authorized_keys

Maka Anda harus memeriksa hal-hal berikut:

  1. id_rsaKunci pribadi terkait disajikan di [email protected]:~/.shh/id_rsa.

  2. Sidik jari repo.server disimpan dalam [email protected]:~/.ssh/known_hostsfile. Biasanya itu akan dilakukan setelah upaya pertama sshuntuk terhubung ke Internet repo.server.

beduin
sumber
Saya lupa mengatakannya. Di bawah Windows, direktori home Anda mungkin adalah C: \ Users \ Username
beduin
5
Mmm .. Git bash sudah semuanya, baca judul pertanyaannya dengan lebih cermat. Juga dari pertanyaan saya berasumsi bahwa pasangan kunci telah dibuat (karena ditanya bagaimana memaksa server repo mengingat id_rsa.pub.) Maaf tentang pemformatan.
beduin
1
Ok, belum pernah mendengar tentang 'git bash' sebelumnya. Maaf ya
sehe
Saya berasumsi ini menggunakan msysgit. Saya menambahkan tag.
Adam Dymitruk
3
Peringatan! Menggunakan cat id_rsa.pub > .ssh/authorized_keysakan menimpa kunci resmi yang ada. Gunakan >>untuk menambahkan alih-alih menimpa.
David Pärsson