Bagikan kunci SSH pribadi dengan Bash di Windows

18

Saya memiliki Windows 10 dengan Git diinstal. Git ini menggunakan C:/Users/MyNamedir saya sebagai direktori HOME dan /.ssh/dir dalam, tepat untuk sumber kunci SSH pribadi saya.

Saya baru saja mengaktifkan dan mengatur "Bash di Ubuntu pada Windows" (sungguh seteguk!) Dan menginstal Git di dalamnya. Saya ingin kedua Gits menggunakan set kunci yang sama sehingga tidak peduli lingkungan tempat saya bekerja di mesin ini, komit saya akan selalu datang dari saya.

Masalahnya adalah bahwa direktori HOME di bash berbeda ( /home/MyName) dan karenanya ia tidak melihat kunci yang terletak di jarak yang sekarang ../../mnt/c/Users/MyName/.ssh. Saya pikir saya akan menjadi pemenang dengan mengubah variabel lingkungan HOME menggunakan

export HOME=/c/mnt/Users/MyName

Ini memang berhasil mengubah direktori HOME tetapi bash git masih tidak melihat kunci yang terkandung di dalam ./.sshdirektori tersebut.

Saya tidak yakin apakah ini A) karena bash git mengharapkan kunci dalam format file yang berbeda? (yang sekarang id_rsadan id_rsa.pub) B) bash git mengabaikan variabel HOME yang diubah? Atau mungkin keduanya.

Saya juga tidak yakin C) jika sewenang-wenang mengubah variabel HOME seperti ini adalah ide yang baik pada umumnya wrt program lain yang mungkin merujuknya?

Toby
sumber
2
Kedengarannya sudah waktunya untuk symlink.
Telastyn
Hmm .sshsudah ada di /home/MyName... bisakah satu file symlink? sedemikian rupa sehingga saya akan lakukan ln -s /mnt/c/Users/MyName/.ssh/id_rsa /.ssh/id_rsa? (juga baru untuk symlinking!)
Toby
LEDAKAN! Itu berhasil! @ Telastyn jika Anda ingin membuat komentar Anda menjadi jawaban saya akan menerima :-) (Meskipun saya masih tidak yakin mengapa hanya mengubah var HOME tidak bekerja di tempat pertama)
Toby
2
Ini berfungsi lebih baik jika Anda menghubungkan seluruh .sshdirektori.
tripleee
1
Ingatan saya adalah bahwa Putty menempatkan barang-barangnya di beberapa lokasi yang berbeda tetapi sudah lebih dari setahun sejak saya terakhir kali harus menyentuh Windows (terima kasih $ dmr)
tripleee

Jawaban:

19

Jadi seperti Telastyn berkomentar saya menambahkan symlinks di WSLs ~/.ssh/ke id_rsa dan id_rsa.pub menggunakan:

> 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

Menggunakan teknik yang sama untuk bukannya menautkan direktori symlink seperti yang disarankan oleh tripleee, saya memiliki masalah sampai saya melihat bahwa garis miring yang saya gunakan dalam lnperintah (kiri dari menggunakan tombol tab untuk memiliki bash mengisi nama direktori) adalah masalah. Jadi, alih-alih melakukan hal di atas, lebih baik melakukannya:

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

File known_hosts sedikit berbeda antara saya menggunakannya (git in PowerShell menggunakan ssh-agent) di Windows dan SSH menggunakannya di WSL, di mana nama host dan IP tidak hash dalam versi Windows. Menurut halaman manual untuk ssh-config, ada flag yang tersedia untuk menonaktifkan hashing ini yang saya maksud SSH akan mengerti file tanpa hashing yang telah bekerja sejauh ini.

Metode yang terakhir ini berarti bahwa rincian yang digunakan untuk SSH yang digunakan antara dua lingkungan yang berbeda persis sama.

Terima kasih kepada Matěj Kříž karena menunjukkan karakter kecil yang hilang tetapi vital!

Toby
sumber
3
Itu harus > ln -s /mnt/c/Users/MyName/.ssh/id_rsa ~/.ssh/id_rsaditambahkan "~". Nggak?
Matěj Kříž
7
perhatikan bahwa tidak mungkin untuk menggunakan private keysdari bash on windowsjika ada yang membuat s linkantara direktori. Melakukan hal itu akan menyebabkan ssh agentpengaduan tentang izin buruk pada file kunci pribadi. Karena file dipasang dari jendela, izin mereka tidak dapat diubah.
Oak
@ oak mungkinkah sama sekali dengan bash?
Tj Gienger
@TjGienger apa maksudmu?
ek
@ ooak, apakah ini yang coba diperbaiki oleh Entity Black di bawah ? Atau apakah itu mengatasi masalah yang berbeda?
sferencik
11

Berdasarkan build baru, izin "Insider Build 17063" untuk file berfungsi berbeda sekarang. Singkatnya yang perlu Anda lakukan:

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

Ini akan membuat izin untuk folder ssh Anda berfungsi sesuai kebutuhan. Kemudian diproses sesuai saran OP dalam jawabannya.

Tautan yang relevan:

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

EDIT

Saya kembali ke pertanyaan ini karena saya tahu ini hanya solusi sementara (ya saya bodoh). Setiap kali Anda me-restart (logout) WSL Anda, Anda harus melemparkan perintah ini lagi.

Jadi solusi yang bekerja untuk saya sekarang adalah mengedit (membuat) file konfigurasi /etc/wsl.confdi ubuntu wsl saya, dan memasukkannya ke dalam, kemudian restart untuk melakukan mounts lagi:

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

Mengapa saya menambahkan metadata:

Izin Linux ditambahkan sebagai metadata tambahan ke file. Ini berarti file dapat membuat Linux dan Windows membaca / menulis / mengeksekusi bit izin.

Mengapa mengatur uid dan gid:

Secara default, WSL menetapkan uid dan gid ke nilai pengguna default (di distro Ubuntu, pengguna default dibuat dengan uid = 1000, gid = 1000). Jika pengguna menentukan opsi gid atau uid secara eksplisit melalui kunci ini, nilai yang terkait akan ditimpa. Jika tidak, nilai default akan selalu ditambahkan.

Tautan yang relevan:

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/

Entity Black
sumber