Поделитесь закрытыми ключами SSH с Bash на Windows


18

У меня Windows 10 с установленным Git. Этот Git использует мой C:/Users/MyNameкаталог в качестве каталога HOME и каталог /.ssh/внутри, соответственно, для получения моих личных ключей SSH.

Я только что включил и настроил «Bash на Ubuntu на Windows» (что за глоток!) И установил там Git. Я хотел бы, чтобы оба Gits использовали один и тот же набор ключей, чтобы не имело значения, в какой среде я работаю на этой машине, мои коммиты всегда будут исходить от меня.

Беда в том, что HOME dir в bash отличается ( /home/MyName) и, следовательно, он не видит ключи, расположенные в теперь отдаленном ../../mnt/c/Users/MyName/.ssh. Я думал, что стану победителем, изменив переменную среды HOME с помощью

export HOME=/c/mnt/Users/MyName

Это успешно изменило каталог HOME, но gash gash по-прежнему не видит ключи, содержащиеся в ./.sshкаталоге.

Я не уверен, если это A), потому что Bash Git ожидает ключи в другом формате файла? (текущие id_rsaи id_rsa.pub) B) git игнорирует измененную переменную HOME? Или, может быть, оба.

Я также не уверен, C) если произвольное изменение переменной HOME, как это, является хорошей идеей в целом для других программ, которые могут ссылаться на нее?


2
Похоже, пришло время для символической ссылки.
Теластин

Хм, .sshуже существует в /home/MyName... можно файлы символической ссылки? такое что я бы сделал ln -s /mnt/c/Users/MyName/.ssh/id_rsa /.ssh/id_rsa? (плохо знаком с символическими ссылками тоже!)
Тоби

БУМ! Это работает удовольствие! @Telastyn, если вы хотите превратить ваш комментарий в ответ, я приму :-) (хотя я все еще не уверен, почему просто не поменять переменную HOME)
Тоби

2
Это работает лучше, если вы используете символическую ссылку на весь .sshкаталог.
tripleee

1
Насколько я помню, PuTTY помещает свои вещи в совершенно другое место, но прошло уже больше года с тех пор, как мне в последний раз приходилось трогать Windows (спасибо $ dmr)
tripleee

Ответы:


19

Так, как прокомментировал Теластин, я добавил символические ссылки в WSL ~/.ssh/к id_rsa и id_rsa.pub, используя:

> 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

Используя ту же технику для связывания каталога с символическими ссылками, как предложено tripleee, у меня были проблемы до тех пор, пока я не увидел, что завершающие косые черты, которые я использовал в lnкоманде (осталось от использования клавиши табуляции, чтобы bash заполнял имя каталога), были проблемой. Таким образом, вместо того, чтобы сделать вышеупомянутое, лучше было бы сделать

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

Файл known_hosts немного отличается между моим использованием (git в powershell с использованием ssh-agent) в Windows и использованием SSH в WSL, при этом имя хоста и IP не хэшируются в версии Windows. Согласно man-странице для ssh-config, есть флаг, позволяющий отключить это хэширование, которое я принял, чтобы SSH понимал файл без хэширования, которое до сих пор работало.

Этот последний метод означает, что детали, используемые для SSH, используемые в двух разных средах, абсолютно одинаковы.

Спасибо Матей Кржиж за то, что он указал на маленького, но жизненно важного персонажа!


3
Следует > ln -s /mnt/c/Users/MyName/.ssh/id_rsa ~/.ssh/id_rsaдобавить "~". Нет?
Матей Кржиж

7
обратите внимание, что невозможно использовать private keysfrom, bash on windowsесли они делают s linkмежду каталогами. Это может привести ssh agentк жалобам на плохое разрешение файлов закрытого ключа. Поскольку файлы смонтированы из окна, их разрешение не может быть изменено.
дуб

@ oak это вообще возможно с bash?
Tj Gienger

@TjGienger что ты имеешь ввиду?
дуб

@ Оак, возможно, это то, что Черная Сущность пытается исправить ниже ? Или это решает другую проблему?
sferencik

11

На основании новой сборки «Insider Build 17063» разрешения для файлов теперь работают по-другому. Короче нужно сделать:

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

Это заставит разрешения для вашей папки ssh работать так, как вам нужно. Затем обрабатывается, как предполагает OP в своем ответе.

Соответствующие ссылки:

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

РЕДАКТИРОВАТЬ

Я вернулся к этому вопросу, потому что я обнаружил, что это только временное решение (да, я тупой). Каждый раз, когда вы перезапускаете (выходите из системы) ваш WSL, вам нужно снова вызывать эти команды.

Таким образом, решение, которое работает для меня сейчас, состоит в том, чтобы отредактировать (создать) конфигурационный файл /etc/wsl.confв моем wsl ubuntu и поместить внутрь следующего, затем перезапустить, чтобы снова выполнить монтирование:

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

Почему я добавляю метаданные:

Разрешения Linux добавляются в файл в качестве дополнительных метаданных. Это означает, что файл может иметь биты разрешения чтения / записи / выполнения в Linux и Windows.

Зачем устанавливать UID и GID:

По умолчанию WSL устанавливает для uid и gid значение пользователя по умолчанию (в дистрибутиве Ubuntu пользователь по умолчанию создается с uid = 1000, gid = 1000). Если пользователь явно указывает опцию gid или uid через этот ключ, соответствующее значение будет перезаписано. В противном случае значение по умолчанию всегда будет добавлено.

Соответствующие ссылки:

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.