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
选项(在我看来,这可能有点重量级)。
默认情况下,大多数/所有 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\n
Run Code Online (Sandbox Code Playgroud)\n您已适当地更换了<your Windows username>
位置<your Linux username>
。其他安装标志将确保目录的权限.ssh
正确。然后重新启动 WSL 发行版并 voil\xc3\xa0,所有 SSH 密钥和配置将在 Linux 中自动可用。任何更改都将同步。
我究竟做错了什么?
SSH 需要对私钥有健全的权限,而您无法在符号链接到不同的文件系统(Windows)时实现这一点。的手册页ssh
非常清楚地解释了这一点:
~/.ssh/id_rsa
包含用于身份验证的私钥。这些文件包含敏感数据,用户应该可以读取但其他人无法访问(读/写/执行)。如果其他人可以访问,ssh 将简单地忽略私钥文件。
如果您想“共享密钥”,您很可能可以复制私钥并设置适当的权限。
基于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)
您需要使用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/