Menjalankan SSH Agent saat memulai Git Bash di Windows

152

Saya menggunakan git bash. Saya harus menggunakan

eval `ssh-agent.exe`
ssh-add /my/ssh/location/

setiap kali saya memulai git bash baru.

Apakah ada cara untuk mengatur agen ssh secara permanen? Atau apakah windows memiliki cara yang baik untuk mengelola kunci ssh?

Saya orang baru, tolong beri saya tutorial rinci, terima kasih!

zchholmes
sumber
3
adalah /my/ssh/location/setara dengan sesuatu seperti /c/Users/Foobar/.ssh/?
Nick
Masalah serupa telah diposting di superuser.com/q/1238486/478378 yang diselesaikan sekarang. Intisari berikut berisi semua detail gist.github.com/jiggneshhgohel/afe96f0d57bdbf8beba305a73905402d . Terima kasih.
Jignesh Gohel

Jawaban:

138

Dalam sesi git bash, Anda dapat menambahkan skrip ke ~/.profileatau ~/.bashrc( dengan ~yang biasanya disetel ke%USERPROFILE% ), agar sesi tersebut diluncurkan secara otomatis ssh-agent. Jika file tidak ada, buat saja.

Inilah yang dijelaskan GitHub dalam " Bekerja dengan frasa sandi kunci SSH ".

Bagian " Peluncuran ssh-agen otomatis pada Git untuk Windows " pada artikel itu memiliki skrip yang kuat yang memeriksa apakah agen tersebut berjalan atau tidak. Di bawah ini hanya cuplikan, lihat artikel GitHub untuk solusi lengkap.

# This is just a snippet. See the article above.
if ! agent_is_running; then
    agent_start
    ssh-add
elif ! agent_has_keys; then
    ssh-add
fi

Sumber Daya Lainnya:

" Mendapatkan ssh-agent untuk bekerja dengan git run dari windows command shell " memiliki skrip yang sama, tetapi saya akan merujuk pada artikel GitHub di atas terutama, yang lebih kuat dan mutakhir.

VONC
sumber
Satu gangguan yang saya miliki adalah jika saya tahu saya tidak akan menggunakan git saya tidak akan memasukkan kata sandi kunci ssh, maka setiap shell yang saya buka memintanya lagi. Ini adalah status 1, agen yang menjalankan kunci w / o, sehingga Anda dapat menghapus ssh-add dari bagian ini maka jika Anda tidak memasukkan frasa sandi pertama kali di sekitar Anda tidak akan ditanya lagi sampai Anda menjalankan ssh-add secara manual.
Andy2K11
@Gordon Bagian mana dari help.github.com/articles/working-with-ssh-key-passphrases ini, tautan GitHub telah berubah? Isinya masih ada, dan tampaknya masih relevan untuk jawaban ini.
VonC
1
@ Andy2K11 Jika Anda ingin memasukkan frasa sandi saat pertama kali Anda membutuhkannya, dan bukan saat membuka shell, cara terbersih untuk saya adalah menghapus ssh-add dari .bash_profile, seperti yang Anda sebutkan, dan menambahkan "AddKeysToAgent yes" ke file .ssh / config Anda (lihat jawaban ini: superuser.com/a/1114257/523133 ). Dengan cara ini Anda bahkan tidak perlu mengingat menjalankan ssh-add.
hardsetting
30

PS: Instruksi ini dalam konteks Bash shell dibuka di Windows 10 Linux Subsystem dan tidak menyebutkan tentang sym-linking kunci SSH yang dihasilkan di Windows dengan Bash di Ubuntu di Windows

1) Perbarui .bashrc Anda dengan menambahkan berikut ini di dalamnya

# Set up ssh-agent
SSH_ENV="$HOME/.ssh/environment"

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

# Source SSH settings, if applicable
if [ -f "${SSH_ENV}" ]; then
    . "${SSH_ENV}" > /dev/null
    kill -0 $SSH_AGENT_PID 2>/dev/null || {
        start_agent
    }
else
    start_agent
fi

2) Kemudian jalankan $ source ~/.bashrcuntuk memuat ulang konfigurasi Anda.

Langkah-langkah di atas telah diambil dari https://github.com/abergs/ubuntuonwindows#2-start-an-bash-ssh-agent-on-launch

3) Buat file konfigurasi SSH, jika tidak ada. Gunakan perintah berikut untuk membuat yang baru:.ssh$ touch config

4) Tambahkan berikut ke ~/.ssh/config

Host github.com-<YOUR_GITHUB_USERNAME> 
HostName github.com
User git
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_work_gmail # path to your private key
AddKeysToAgent yes


Host csexperimental.abc.com
IdentityFile ~/.ssh/id_work_gmail # path to your private key
AddKeysToAgent yes

<More hosts and github configs can be added in similar manner mentioned above>

5) Tambahkan kunci Anda ke agen SSH menggunakan perintah $ ssh-add ~/.ssh/id_work_gmaildan kemudian Anda harus dapat terhubung ke akun github Anda atau host jarak jauh menggunakan ssh. Sebagai contoh dalam konteks contoh kode di atas:

$ ssh github.com-<YOUR_GITHUB_USERNAME>

atau

$ ssh <USER>@csexperimental.abc.com

Penambahan kunci untuk agen SSH ini harus dilakukan hanya satu kali.

6) Sekarang logout dari sesi Bash Anda pada Windows Linux Subsystem yaitu keluar dari semua konsol Bash lagi dan mulai konsol baru lagi dan coba SSH ke Host Github Anda atau host lain yang dikonfigurasi dalam file konfigurasi SSH dan seharusnya bekerja tanpa memerlukan tambahan Langkah.

catatan:

Terima kasih.

Jignesh Gohel
sumber
1
Alternatif yang menarik, menggunakan WSL. +1
VonC
@JigneshGohel Terima kasih, skrip ini sempurna dan sangat bersih! Aku hanya bertanya-tanya, mengapa kamu punya >> "${SSH_ENV}"? Bukankah seharusnya begitu > "${SSH_ENV}"? Anda berhasil, tentu saja, tetapi hanya berakhir dengan ~/.ssh/environmentfile yang lebih lama dan lebih lama , karena (seperti yang saya pikirkan saat ini !?) tanpa alasan ... Banyak, terima kasih banyak! Saya merasa skrip ini harus dimasukkan dalam default .bashrcuntuk WSL Ubuntu, ini sangat berguna!
MikeBeaton
5

Saya menemukan cara paling lancar untuk mencapai ini adalah menggunakan Pageant sebagai agen SSH dan plink.

Anda perlu mengkonfigurasi sesi dempul untuk nama host yang digunakan di remote Anda.

Anda juga perlu plink.exe yang dapat diunduh dari situs yang sama dengan dempul.

Dan Anda perlu Pageant berjalan dengan kunci Anda dimuat. Saya memiliki pintasan ke kontes di folder startup saya yang memuat kunci SSH saya ketika saya masuk.

Ketika Anda menginstal git-scm, Anda kemudian dapat menentukannya untuk menggunakan tortoise / plink daripada OpenSSH.

Efek bersihnya adalah Anda dapat membuka git-bash kapan pun Anda suka dan mendorong / menarik tanpa tertantang untuk frasa sandi.

Hal yang sama berlaku dengan sesi dempul dan WinSCP ketika kontes memuat kunci Anda. Itu membuat hidup jauh lebih mudah (dan aman).

Alasdair
sumber
2

Karena saya tidak suka menggunakan dempul di Windows sebagai solusinya, saya membuat utilitas ssh-agent-wrapper yang sangat sederhana . Ini memindai folder .ssh Anda dan menambahkan semua kunci Anda ke agen. Anda hanya perlu memasukkannya ke folder startup Windows agar bisa berfungsi.

Asumsi :

  • ssh-agent di jalur
  • shh-add in path (keduanya dengan memilih opsi "RED" saat menginstal git
  • kunci pribadi ada di folder% USERPROFILE% / .sh
  • nama kunci pribadi dimulai dengan id (mis. id_rsa)
Erez A. Korn
sumber
Bagus! +1. Saya selalu bekerja dengan openssh (bukan dempul), jadi ini adalah solusi menarik untuk kunci pribadi dengan frasa sandi.
VonC
Karena Anda sudah menggunakan github, lalu mengapa tidak membuat sumber repositori git saja?
Thorbjørn Ravn Andersen
Hapus saja / rilis dari jalur. ;-)
Erez A. Korn
1

Saya tidak bisa mendapatkan ini bekerja berdasarkan jawaban terbaik, mungkin karena saya seperti PC noob dan kehilangan sesuatu yang jelas. Tetapi hanya FYI jika itu membantu seseorang yang tertantang seperti saya, apa yang AKHIRNYA bekerja adalah melalui salah satu tautan di sini (dirujuk dalam jawaban). Ini melibatkan hanya menempelkan yang berikut ke saya .bash_profile:

env=~/.ssh/agent.env

agent_load_env () { test -f "$env" && . "$env" >| /dev/null ; }

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

agent_load_env

# agent_run_state: 0=agent running w/ key; 1=agent w/o key; 2= agent not running
agent_run_state=$(ssh-add -l >| /dev/null 2>&1; echo $?)

if [ ! "$SSH_AUTH_SOCK" ] || [ $agent_run_state = 2 ]; then
    agent_start
    ssh-add
elif [ "$SSH_AUTH_SOCK" ] && [ $agent_run_state = 1 ]; then
    ssh-add
fi

unset env

Saya mungkin memiliki sesuatu yang dikonfigurasi aneh, tetapi tidak berhasil ketika saya menambahkannya ke .profileatau.bashrc . Tantangan nyata lain yang saya temui adalah saya bukan admin di komputer ini dan tidak dapat mengubah variabel lingkungan tanpa disetujui oleh IT, jadi ini adalah solusi bagi mereka yang tidak dapat mengaksesnya.

Anda tahu itu berfungsi jika Anda diminta kata sandi ssh saat Anda membuka git bash. Haleluya akhirnya berhasil.

Ambrown
sumber
1

Letakkan ini di ~ / .bashrc Anda (atau file yang sumbernya berasal darinya) yang akan menghentikannya dijalankan beberapa kali secara tidak perlu per shell:

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

Dan kemudian tambahkan "AddKeysToAgent yes" ke ~ / .ssh / config:

Host *
    AddKeysToAgent yes

ssh ke server Anda (atau git pull) secara normal dan Anda hanya akan diminta kata sandi / frasa sandi satu kali per sesi.

mza
sumber
0

Buat file .bashrc baru di direktori ~ Anda.

Di sana Anda dapat menempatkan perintah yang ingin Anda eksekusi setiap kali Anda memulai bash

pengguna2711262
sumber
Itu harus bekerja. Cobalah untuk meletakkan sesuatu yang sederhana pada .bashrcfile tersebut (seperti echo testdan periksa apakah itu dimuat ketika Anda menjalankan Git Bash.
David Ferenczy Rogožan
Juga perhatikan bahwa ~ di PowerShell kemungkinan berbeda dari ~ di Git Bash / Cygwin tergantung pada versi apa yang diinstal dan opsi pengguna yang ditentukan.
dragon788
@Yar Pada Windows, masukkan .bashrcfolder pengguna Anda, mis C:\Users\john.
Martin van Driel
0

Solusi dua string sederhana dari jawaban ini :

Untuk sh , bash , dll:

# ~/.profile
if ! pgrep -q -U `whoami` -x 'ssh-agent'; then ssh-agent -s > ~/.ssh-agent.sh; fi
. ~/.ssh-agent.sh

Untuk csh , tcsh , dll:

# ~/.schrc
sh -c 'if ! pgrep -q -U `whoami` -x 'ssh-agent'; then ssh-agent -c > ~/.ssh-agent.tcsh; fi'
eval `cat ~/.ssh-agent.tcsh`
oklas
sumber