我可以在 WSL 和 Windows 之间共享我的 SSH 密钥吗?

我可以在 WSL 和 Windows 之间共享我的 SSH 密钥吗?

我正在尝试从使用 Powershell 转到 Windows 上的 Bash(适用于 Linux 的 Windows 子系统或 WSL)。为了使用 GIT,我在 中设置了我的 SSH 密钥C:/Users/User/.ssh。然后我登录 Bash,并创建了一个符号链接ln -s /mnt/c/Users/User/.ssh/ ~/.ssh/,以便(理论上)在两个 shell 中使用相同的 ssh 密钥。

但是,当运行 git 时,我总是收到错误:Bad owner or permissions on /home/user/.ssh/config。我做错了什么?

答案1

我究竟做错了什么?

SSH 要求私钥具有合理的权限,而符号链接到不同的文件系统 (windows) 时,您无法实现这一点。手册页对此ssh进行了非常清晰的解释:

~/.ssh/id_rsa

包含用于身份验证的私钥。这些文件包含敏感数据,应该可供用户读取,但其他人无法访问(读/写/执行).如果其他人可以访问私钥文件,ssh 将忽略它。

如果您想“共享密钥”,您很可能可以复制私钥并设置适当的权限。

答案2

基于@ChadT 的帮助回答,这是对我有用的。

打开您的发行版,并创建或修改文件/etc/wsl.conf以包含automount以下选项:

$ cat /etc/wsl.conf
[automount]
options = "metadata,umask=022,fmask=111"

这些选项确保已安装系统中的文件被赋予适当的用户和组所有权,并且它们具有合理的默认权限(而不是所有内容都获得777)。

关闭发行版,等待大约 10 秒使后台子系统停止运行,然后重新打开发行版。

导航到已安装的 C: 驱动器,并根据 SSH 的要求/mnt/c/Users/<user>对目录和密钥文件设置适当的权限:.ssh

$ cd /mnt/c/Users/<user>
$ chmod 700 .ssh
$ chmod 600 .ssh/id_rsa
$ chmod 644 .ssh/id_rsa.pub

最后,导航到您的发行版的主驱动器,备份或删除任何现有.ssh目录,并创建指向您的 C: 驱动器.ssh目录的符号链接:

$ cd ~
$ mv .ssh .ssh_orig
$ ln -s /mnt/c/Users/plw1845/.ssh/ .ssh

现在您应该能够与 WSL 发行版完全共享 Windows SSH 配置、主机和密钥,同时将它们保存在一个地方。

答案3

这是一个直接挂载.ssh目录的解决方案,不需要进行更改/etc/wsl.conf即可启用该metadata选项(在我看来,这可能有点重量级)。

默认情况下,大多数/所有 Linux 发行版都会读取和处理文件fstab启动时自动挂载文件系统。WSL 2也同样如此. 由于 Windows 驱动器和文件夹可以使用 DrvFs 直接在 WSL 中挂载,我们可以将它们结合起来,实现.ssh操作系统之间自动同步目录。

打开你的 Linux 发行版并/etc/fstab以 root 身份编辑该文件(例如使用sudo nano /etc/fstab)。在末尾添加以下行:

C:\Users\<your Windows username>\.ssh\ /home/<your Linux username>/.ssh drvfs rw,noatime,uid=1000,gid=1000,case=off,umask=0077,fmask=0177 0 0

您已正确替换<your Windows username>和的位置<your Linux username>。其他挂载标志将确保.ssh目录上的权限正确。然后重新启动 WSL 发行版瞧,您的所有 SSH 密钥和配置都将自动在 Linux 中可用。任何更改都将同步。

答案4

基于以下解决方案加布里埃尔·马杰里,在你的 WSL 发行版中执行以下脚本:

# Create .ssh directory in home directory with proper permission
mkdir -m 700 ~/.ssh

# Get Windows user name
WINUSER=`cmd.exe /c 'echo %USERNAME%' | tr -d '\r'`

# Add a permanent mount entry for Windows user .ssh directory
cat << EOF | sudo tee -a /etc/fstab
C:\Users\\$WINUSER\.ssh\ /home/$USER/.ssh drvfs rw,noatime,uid=`id -u`,gid=`id -g`,case=off,umask=0077,fmask=0177 0 0
EOF

# Mount the .ssh
sudo mount /home/$USER/.ssh

相关内容