Udostępniaj prywatne klucze SSH Bashowi w systemie Windows

18

Mam zainstalowany system Windows 10 z Git. Ten Git używa mojego C:/Users/MyNamekatalogu jako katalogu HOME i katalogu /.ssh/wewnątrz, odpowiednio do pozyskiwania moich prywatnych kluczy SSH.

Właśnie włączyłem i skonfigurowałem „Bash na Ubuntu w systemie Windows” (co za kęs!) I zainstalowałem tam również Gita. Chciałbym, aby oba Gits używały tego samego zestawu kluczy, tak że nie ma znaczenia, w jakim środowisku pracuję na tym komputerze, moje zobowiązania zawsze będą ode mnie pochodziły.

Problem w tym, że katalog HOME w bashu jest inny ( /home/MyName) i dlatego nie widzi kluczy znajdujących się w odległym teraz ../../mnt/c/Users/MyName/.ssh. Myślałem, że zwyciężę, zmieniając zmienną środowiskową HOME za pomocą

export HOME=/c/mnt/Users/MyName

To zmieniło katalog HOME, ale gash bash nadal nie widzi kluczy zawartych w katalogu ./.ssh.

Nie jestem pewien, czy to jest A), ponieważ bash git oczekuje kluczy w innym formacie pliku? (obecne są id_rsai id_rsa.pub) B) bash git ignoruje zmienioną zmienną HOME? A może jedno i drugie.

Nie jestem też pewien, czy C) czy dowolna zmiana zmiennej HOME jest dobrym pomysłem na ogół, czy inne programy mogą się do niej odwoływać?

Toby
źródło
2
Wygląda na to, że nadszedł czas na dowiązanie symboliczne.
Telastyn
Hmm .sshjuż istnieje w /home/MyName... czy jeden plik dowiązań symbolicznych? takie, które bym zrobił ln -s /mnt/c/Users/MyName/.ssh/id_rsa /.ssh/id_rsa? (nowość także w symlinkowaniu!)
Toby
BUM! To działa na ucztę! @Telastyn, jeśli chcesz zamienić swój komentarz w odpowiedź, zaakceptuję :-) (Choć nadal nie jestem pewien, dlaczego po prostu zmiana wariantu HOME nie zadziałała)
Toby
2
Działa lepiej, jeśli dowiązujesz symetrycznie cały .sshkatalog.
tripleee
1
Przypominam sobie, że PuTTY umieszcza swoje rzeczy w zupełnie innej lokalizacji, ale minął ponad rok, odkąd ostatni raz musiałem dotknąć Windowsa (dzięki $ dmr)
tripleee

Odpowiedzi:

19

Tak jak skomentował Telastyn, dodałem dowiązania symboliczne w WSL ~/.ssh/do plików id_rsa i id_rsa.pub, używając:

> ln -s /mnt/c/Users/MyName/.ssh/id_rsa ~/.ssh/id_rsa
> ln -s /mnt/c/Users/MyName/.ssh/id_rsa.pub ~/.ssh/id_rsa.pub

Stosując tę ​​samą technikę zamiast linkowania katalogu dowiązania symbolicznego, jak sugeruje trójka, miałem problemy, dopóki nie zauważyłem, że końcowe ukośniki użyte w lnpoleceniu (odeszły od użycia klawisza tab, aby bash wypełnił nazwę katalogu) były problemem. Dlatego zamiast robić powyższe, lepiej byłoby zrobić:

> ln -s /mnt/c/Users/Myname/.ssh ~/.ssh

Plik znany_hosty różni się nieznacznie między moim użyciem go (git w PowerShell przy użyciu ssh-agent) w systemie Windows a użyciem SSH w WSL, przy czym nazwa hosta i adres IP nie są mieszane w wersji Windows. Według strony podręcznika dla ssh-config dostępna jest flaga, która wyłącza to haszowanie, które wziąłem przez to, że SSH zrozumie plik bez haszowania, który do tej pory się sprawdził.

Ta ostatnia metoda oznacza, że ​​szczegóły zastosowane dla SSH używane między dwoma różnymi środowiskami są dokładnie takie same.

Dziękujemy Matějowi Křížowi za wskazanie małej, ale istotnej zaginionej postaci!

Toby
źródło
3
Należy > ln -s /mnt/c/Users/MyName/.ssh/id_rsa ~/.ssh/id_rsadodać „~”. Nie?
Matěj Kříž
7
zwróć uwagę, że nie można użyć opcji private keysfrom, bash on windowsjeśli zawiera s linkmiędzy katalogami. Spowoduje to ssh agentnarzekanie na złe uprawnienia do plików kluczy prywatnych. Ponieważ pliki zamontowane z okna nie można zmienić ich uprawnień.
dąb
@ak czy jest to w ogóle możliwe dzięki bashowi?
Tj
@TjGienger co masz na myśli?
dąb
@oak, czy może to właśnie Entity Black próbuje naprawić poniżej ? Czy to dotyczy innego problemu?
sferencik
11

W oparciu o nową kompilację „Insider Build 17063” uprawnienia do plików działają teraz inaczej. Krótko mówiąc, musisz zrobić:

sudo umount /mnt/c
sudo mount -t drvfs C: /mnt/c -o metadata

Spowoduje to, że uprawnienia do folderu ssh będą działać tak, jak potrzebujesz. Następnie postępuje zgodnie z sugestią OP w swojej odpowiedzi.

Ważne linki:

https://github.com/Microsoft/WSL/issues/3181 https://blogs.msdn.microsoft.com/commandline/2018/01/12/chmod-chown-wsl-improvements/

EDYTOWAĆ

Wracam do tego pytania, ponieważ dowiaduję się, że jest to tylko tymczasowe rozwiązanie (tak, jestem głupi). Za każdym razem, gdy ponownie uruchomisz (wylogujesz się) swoją WSL, musisz ponownie rzucić te polecenia.

Tak więc rozwiązaniem, które teraz działa dla mnie, jest edycja (tworzenie) pliku konfiguracyjnego /etc/wsl.confw moim Ublc wsl i wsl wewnątrz, a następnie ponowne uruchomienie, aby ponownie wykonać montowanie:

# Enable extra metadata options by default, set uid and gid to 0
[automount]
options = "metadata,uid=,gid="

Dlaczego dodaję metadane:

Uprawnienia do systemu Linux są dodawane jako dodatkowe metadane do pliku. Oznacza to, że plik może mieć bity uprawnień do odczytu / zapisu / wykonywania w systemie Linux i Windows.

Dlaczego warto ustawić UID i GID:

Domyślnie WSL ustawia identyfikator UID i GID na wartość domyślnego użytkownika (w dystrybucji Ubuntu domyślny użytkownik jest tworzony z UID = 1000, GID = 1000). Jeśli użytkownik wyraźnie określi opcję gid lub uid za pomocą tego klucza, powiązana wartość zostanie zastąpiona. W przeciwnym razie zawsze zostanie dodana wartość domyślna.

Ważne linki:

https://docs.microsoft.com/en-us/windows/wsl/wsl-config https://blogs.msdn.microsoft.com/commandline/2018/02/07/automatically-configuring-wsl/ https: / /blogs.msdn.microsoft.com/commandline/2018/01/12/chmod-chown-wsl-improvements/

Czarny podmiot
źródło