Uruchamianie agenta SSH podczas uruchamiania Git Bash w systemie Windows

152

Używam git bash. Muszę użyć

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

za każdym razem, gdy zaczynam nowy git bash.

Czy istnieje sposób na trwałe ustawienie agenta ssh? A może system Windows ma dobry sposób na zarządzanie kluczami SSH?

Jestem nowym facetem, proszę o szczegółowy poradnik, dzięki!

zchholmes
źródło
3
jest /my/ssh/location/porównywalne opcje do czegoś podobnego /c/Users/Foobar/.ssh/?
Nick
Podobny problem został opublikowany na superuser.com/q/1238486/478378 i został już rozwiązany. Poniższy opis zawiera wszystkie szczegóły gist.github.com/jiggneshhgohel/afe96f0d57bdbf8beba305a73905402d . Dzięki.
Jignesh Gohel

Odpowiedzi:

138

W sesji git bash, można dodać do skryptu ~/.profilelub ~/.bashrc( przy ~czym zazwyczaj ustawione%USERPROFILE% ) automatycznie, w celu wspomnianej sesji do uruchomienia ssh-agent. Jeśli plik nie istnieje, po prostu go utwórz.

To właśnie opisuje GitHub w artykule „ Praca z hasłami klucza SSH ”.

Sekcja „ Automatyczne uruchamianie agenta ssh w systemie Git dla systemu Windows ” tego artykułu zawiera solidny skrypt, który sprawdza, czy agent działa, czy nie. Poniżej znajduje się tylko fragment, zobacz artykuł GitHub, aby uzyskać pełne rozwiązanie.

# 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

Inne zasoby:

Uruchamianie ssh-agent do pracy z git run z poziomu powłoki poleceń systemu Windows ” ma podobny skrypt, ale przede wszystkim odniosę się do powyższego artykułu GitHub, który jest bardziej rozbudowany i aktualny.

VonC
źródło
Jedną drobną irytacją było to, że gdybym wiedział, że nie będę używał gita, nie wprowadzałbym hasła klucza ssh, a następnie każda otwierana powłoka pytała o to ponownie. To jest stan 1, agent działa bez klucza, więc możesz usunąć ssh-add z tej sekcji, a jeśli nie wprowadzisz hasła za pierwszym razem, nie zostaniesz ponownie zapytany, dopóki ręcznie nie uruchomisz ssh-add.
Andy2K11
@Gordon Która część tego linku help.github.com/articles/working-with-ssh-key-passphrases GitHub uległa zmianie? Jego treść wciąż tam jest i nadal wydaje się istotna dla tej odpowiedzi.
VonC
1
@ Andy2K11 Jeśli chcesz wprowadzić hasło za pierwszym razem, gdy go potrzebujesz, a nie podczas otwierania powłoki, najczystszym sposobem jest usunięcie ssh-add z .bash_profile, jak wspomniałeś, i dodanie „AddKeysToAgent yes” do plik .ssh / config (patrz odpowiedź: superuser.com/a/1114257/523133 ). W ten sposób nie musisz nawet pamiętać o uruchomieniu ssh-add.
hardsetting
30

PS: Te instrukcje są w kontekście powłoki Bash otwartej w podsystemie Windows 10 Linux i nie wspominają o łączeniu symboli SSH kluczy generowanych w systemie Windows z Bash w systemie Ubuntu w systemie Windows

1) Zaktualizuj swój .bashrc , dodając w nim następujące

# 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) Następnie uruchom, $ source ~/.bashrcaby ponownie załadować plik config.

Powyższe kroki pochodzą z https://github.com/abergs/ubuntuonwindows#2-start-an-bash-ssh-agent-on-launch

3) Utwórz plik konfiguracyjny SSH, jeśli go nie ma. Użyj następującego polecenia, aby utworzyć nowy:.ssh$ touch config

4) Dodaj następujące do ~/.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) Dodaj swój klucz do agenta SSH za pomocą polecenia, $ ssh-add ~/.ssh/id_work_gmaila następnie powinieneś być w stanie połączyć się z kontem github lub zdalnym hostem za pomocą ssh. Na przykład w kontekście powyższych przykładów kodu:

$ ssh github.com-<YOUR_GITHUB_USERNAME>

lub

$ ssh <USER>@csexperimental.abc.com

To dodanie klucza do agenta SSH powinno być wymagane tylko raz.

6) Teraz wyloguj się z sesji Bash w podsystemie Windows Linux, tj. Ponownie zamknij wszystkie konsole Bash i ponownie uruchom nową konsolę i spróbuj SSH do swojego hosta Github lub innego hosta skonfigurowanego w pliku konfiguracyjnym SSH i powinno działać bez potrzeby dodatkowego kroki.

Uwaga:

Dzięki.

Jignesh Gohel
źródło
1
Ciekawa alternatywa, użycie WSL. +1
VonC
@JigneshGohel Dziękuję, ten skrypt jest doskonały i b. Czysty! Zastanawiałem się tylko, dlaczego masz >> "${SSH_ENV}"? Czy nie powinno tak być > "${SSH_ENV}"? Wasze prace oczywiście, ale po prostu kończy się powoli coraz dłuższym ~/.ssh/environmentplikiem, z (jak myślę obecnie !?) bez powodu ... Ale wielkie, wielkie dzięki! Uważam, że ten skrypt powinien być dołączony do domyślnej wersji .bashrcWSL Ubuntu, jest bardzo przydatny!
MikeBeaton
5

Odkryłem, że najłatwiejszym sposobem osiągnięcia tego jest użycie Pageant jako agenta SSH i plink.

Musisz mieć skonfigurowaną sesję putty dla nazwy hosta używanej w pilocie.

Będziesz także potrzebował pliku plink.exe, który można pobrać z tej samej strony, co kit.

I potrzebujesz programu Pageant działającego z załadowanym kluczem. Mam skrót do konkursu w moim folderze startowym, który ładuje mój klucz SSH po zalogowaniu.

Kiedy instalujesz git-scm, możesz określić, aby używał tortoise / plink zamiast OpenSSH.

Efektem netto jest to, że możesz otworzyć git-bash, kiedy tylko chcesz i push / pull bez wyzwania dla haseł.

To samo dotyczy sesji putty i WinSCP, gdy program konkursowy ma załadowany klucz. To sprawia, że ​​życie jest o wiele łatwiejsze (i bezpieczne).

Alasdair
źródło
2

Ponieważ nie lubię używać szpachli w systemie Windows jako obejścia, stworzyłem bardzo proste narzędzie ssh-agent-wrapper . Skanuje foldery .ssh i dodaje wszystkie klucze do agenta. Aby działał, wystarczy umieścić go w folderze startowym systemu Windows.

Założenia :

  • ssh-agent w ścieżce
  • shh-add in path (obie opcje wybierając opcję "RED" podczas instalacji git
  • klucze prywatne znajdują się w folderze% USERPROFILE% /. ssh
  • nazwy kluczy prywatnych zaczynają się od id (np. id_rsa)
Erez A. Korn
źródło
Miły! +1. Zawsze pracuję z openssh (nie putty), więc jest to ciekawe rozwiązanie dla kluczy prywatnych z hasłami.
VonC,
Skoro już jesteś na githubie, dlaczego nie uczynić źródła repozytorium git?
Thorbjørn Ravn Andersen
Po prostu usuń / release ze ścieżki. ;-)
Erez A. Korn
1

Nie mogłem zmusić tego do pracy w oparciu o najlepszą odpowiedź, prawdopodobnie dlatego, że jestem takim noobem z komputera i brakuje mi czegoś oczywistego. Ale po prostu do Twojej wiadomości na wypadek, gdyby pomogło to komuś takiemu jak ja, to, co W KOŃCU zadziałało, to jeden z linków tutaj (wymienionych w odpowiedziach). Wymagało to po prostu wklejenia następujących elementów do mojego .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

Prawdopodobnie skonfigurowałem coś dziwnego, ale nie powiodło się, gdy dodałem to do mojego .profilelub .bashrc. Innym prawdziwym wyzwaniem, z którym się spotkałem, jest to, że nie jestem administratorem na tym komputerze i nie mogę zmieniać zmiennych środowiskowych bez uzyskania ich zatwierdzenia przez IT, więc jest to rozwiązanie dla tych, którzy nie mają do niego dostępu.

Wiesz, że to działa, jeśli po otwarciu git bash pojawi się monit o podanie hasła ssh. Alleluja w końcu zadziałało.

Ambrown
źródło
1

Umieść to w swoim ~ / .bashrc (lub pliku, który pochodzi z tego źródła), co uniemożliwi jego wielokrotne niepotrzebne uruchamianie na powłokę:

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

Następnie dodaj „AddKeysToAgent yes” do ~ / .ssh / config:

Host *
    AddKeysToAgent yes

ssh na twój serwer (lub git pull) normalnie i będziesz proszony o hasło / hasło tylko raz na sesję.

mza
źródło
0

Utwórz nowy plik .bashrc plik w swoim katalogu ~.

Tam możesz umieścić swoje polecenia, które chcesz wykonywać za każdym razem, gdy uruchamiasz bash

user2711262
źródło
To musi działać. Spróbuj umieścić coś prostego w takim .bashrcpliku (na przykład echo testi sprawdź, czy jest ładowany po uruchomieniu Git Bash.
David Ferenczy Rogožan
Należy również zauważyć, że ~ w PowerShell prawdopodobnie różni się od ~ w Git Bash / Cygwin w zależności od zainstalowanej wersji i określonych opcji użytkownika.
dragon788
@Yar W systemie Windows umieść .bashrcw folderze użytkownika, np C:\Users\john.
Martin van Driel
0

Proste rozwiązanie dwustrunowe z tej odpowiedzi :

Dla sh , bash itp .:

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

W przypadku csh , tcsh itp .:

# ~/.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
źródło