为什么 chmod 在 Windows 上的 bash 模拟中不起作用?

为什么 chmod 在 Windows 上的 bash 模拟中不起作用?

我刚刚安装适用于 Windows 的 Git 2.30.1并使用 生成 ssh 密钥。我的私钥具有权限 644,我无法使用 chmod 更改它。运行时, 此文件的权限没有任何错误或影响。ssh-keygen -t ed25519 -C "[email protected]"chmod 600 id_ed25519

我知道 Windows 及其文件系统不支持类似 unix 的权限,但我需要设置它们才能被另一方(bitbucket 实例)接受。还有人有这个问题吗?

为什么我认为权限是问题所在?

我可以使用相同的密钥和正确的权限从另一台机器通过 ssh 进行连接。根据sshd 的手册页如果您的私钥是群组/全球可访问的,它将不会被接受。

更新

Cygwin 和 Git-Bash 在查看密钥文件的权限时显示不同的结果:

# Cygwin
-rwx------+ 1 myUserName someGroup 464 Feb 11 16:43 id_ed25519
# Git-Bash
-rw-r--r-- 1 myUserName someGroupNo 464 Feb 11 16:43 id_ed25519

答案1

我知道 Windows 及其文件系统不支持权限

确实如此,甚至比 Linux 还要多。Windows 和 NTFS 文件系统都具有相同的基本“读取、写入、执行”权限,但还有一些其他权限,例如“附加”或“取得所有权”。Windows 文件权限也完全基于 ACL - 没有固定的“组”或“所有者”位置。

(一个相关区别是 Windows 和 NTFS 有一个权限继承系统。创建文件时,其权限会从父目录复制,但这些权限会被标记为“继承”且不可更改 - 您必须禁用继承才能断开链接,只有这样您才能完全更改它们。)

当将类 Unix 工具chmod移植到 Windows 时,需要教它们如何将类 Unix 权限转换为 Windows 权限并转换回来。有时它们处理得很好,例如如果您使用 Cygwin。但在某些情况下,就像 Git for Windows 附带的 MSYS 工具一样,它们……根本不关心这一点。MSYS 'chmod' 工具仅被编程为更改文件的“只读”位,不知道如何使用 ACL,同样,MSYS 'ls' 命令甚至不会读取它们。

因此,如果您想确保您的 SSH 私钥受到保护,请使用 Windows 文件权限工具icacls(当然也可以使用 GUI“属性”对话框)– 首先使用 禁用继承/inheritance:d,然后使用 删除任何不需要的 ACE /remove。(保留 SYSTEM 条目。)

您可以放心地忽略 MSYSls -l命令显示的有关文件的信息;它的输出与实际情况不符,并且它始终会假装文件是 0644。同样,MSYSssh命令不会抱怨权限不正确。(权限检查完全在客户端进行 - SSH 服务器甚至不知道密钥是否存储在文件中,更不用说文件是什么样子了。)

答案2

问题解决了我遇到的实际问题。我错误地认为权限是问题所在,但事实并非如此。实际上,我尝试修改权限,即使 cygwin 显示“错误权限”(除具有读取权限的所有者之外),我也可以使用 git clone 和 ssh 而不会出现任何问题。在 Linux 下,ssh 客户端阻止我使用具有错误权限的密钥。

通常我会使用多个具有不同文件名的 ssh 密钥(从不使用默认文件名),因此我将 ssh 配置为对特定主机使用特定标识文件。这就是我首先拥有配置文件的原因。所以如果您没有配置文件,请不要担心。这是我的配置(C:\Users\myUser\.ssh\config):

# work
Host Work-Github
  HostName work-github.com
  User git
  IdentityFile ~/.ssh/id_ed25519_work
  PreferredAuthentications publickey

# personal
Host GitHub
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_ed25519_personal
  PreferredAuthentications publickey

我将其全部替换为以下内容,从而解决了我的问题:

AddKeysToAgent yes
IdentityFile ~/.ssh/id_ed25519_work
IdentityFile ~/.ssh/id_ed25519_personal

答案3

消息针对的是 OP 关于将组更改为“用户”的评论。
我相信组的名称与区域设置有关。
因此,一个可能的解决方案是使用其 GID 545 来处理“用户”组。
就像这样:

chgrp 545 ~/.ssh/id_ed25519

其中 'chgrp' 是用于将所提供文件的组 ID(此示例中为 ~/.ssh/id_ed25519)更改为所提供组 ID(示例中为 545,是 'Users' 的同义词)的实用程序。

相关内容