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

blu*_*isk 13 ssh bash git windows-subsystem-for-linux

我正在尝试从使用 Powershell 转向 Windows 上的 Bash(适用于 Linux 或 WSL 的 Windows 子系统)。为了使用 GIT,我在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. 我究竟做错了什么?

小智 12

为了以@ChadT 的有用答案为基础,这对我有用。

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

$ cat /etc/wsl.conf
[automount]
options = "metadata,umask=022,fmask=111"
Run Code Online (Sandbox Code Playgroud)

这些选项确保已安装系统中的文件被赋予适当的用户和组所有权,并且它们具有合理的默认权限(而不是所有内容都获得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
Run Code Online (Sandbox Code Playgroud)

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

$ cd ~
$ mv .ssh .ssh_orig
$ ln -s /mnt/c/Users/plw1845/.ssh/ .ssh
Run Code Online (Sandbox Code Playgroud)

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


小智 10

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

\n

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

\n

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

\n
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\n
Run Code Online (Sandbox Code Playgroud)\n

您已适当地更换了<your Windows username>位置<your Linux username>。其他安装标志将确保目录的权限.ssh正确。然后重新启动 WSL 发行版并 voil\xc3\xa0,所有 SSH 密钥和配置将在 Linux 中自动可用。任何更改都将同步。

\n


Jak*_*uje 7

我究竟做错了什么?

SSH 需要对私钥有健全的权限,而您无法在符号链接到不同的文件系统(Windows)时实现这一点。的手册页ssh非常清楚地解释了这一点:

~/.ssh/id_rsa

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

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


Cha*_*ang 7

基于Gabriel Majeri的解决方案,在 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
Run Code Online (Sandbox Code Playgroud)


Cha*_*adT 5

您需要使用DrvFS文件系统挂载 Windows文件系统,并metadata选择允许 Linux 权限与 Windows 文件共存,方法是将它们存储在文件元数据中。

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

这将允许您跨两个操作系统使用您的 SSH 密钥。

进一步阅读:https : //blogs.msdn.microsoft.com/commandline/2018/01/12/chmod-chown-wsl-improvements/

还有更多关于如何配置WSL以在每次启动时应用此设置的阅读:https : //blogs.msdn.microsoft.com/commandline/2018/02/07/automatically-configuring-wsl/