在Windows 8中使用Cygwin,chmod 600无法按预期工作吗?


75

我正在尝试key.pemCygwin 1.7.11中更改对我的密钥文件的权限。它具有权限标志:-rw-rw----

chmod -c 600 key.pem

报告:

'key.pem'的模式从0660(rw-rw ----)更改为0600(rw -------)

然而:

ls -l key.pem 

仍在报告

key.pem的许可标志仍然是:-rw-rw ----

我要问的原因是ssh在抱怨:

'key.pem'的权限0660太开放。

当我尝试SSH进入我的Amazon EC2实例时。 是Cygwin和Windows 8 NTFS的问题,还是我缺少什么?


这听起来像Win8 / Cygwin错误。我建议在Cygwin邮件列表中进行报告。
2012年

它可能与NTFS有关... Windows并未真正使用该Linux方案。也许您可以尝试进入Windows权限设置并仅授予自己权限...
sinni800 2012年

Answers:


97

我在Win8CP中使用Cygwin,但遇到了同样的问题。绝对是Cygwin的错误,但是有一种解决方法:尝试运行:

 chgrp -R Users ~/.ssh

较长的解释是,由于某种原因,Cygwin的/etc/passwd/etc/groupgeneration将用户的默认/主组设置为None。并且您不能更改的许可None,因此chmodfor组无效。

我没有尝试自己修复passwd/ group文件,但确实做了一个chgrp -R Users ~/.ssh(或者,如果您使用的是Windows 8预发行版,则使用组名HomeUsers)。之后,您可以执行chmod 0600,它将按预期工作。

chgrpUsers组中可以找到哪些其它类似的情况来完成。由于Cygwin将用户Users作为次要组(而不是primary,这是正确的行为),将其作为次要组,因此它甚至可以按预期工作。


12
我需要chgrp命令-RV用户的〜/ .ssh / *文件模式-vr 600的〜/ .ssh / *
托马什Fejfar

上面的@TomášFejfar评论对我有用。谢谢。
scaraveos

@TomášFejfar非常有帮助,也许它应该找到安装脚本之类的方法
破译的2013年

4
请注意,如果您以其他语言安装的Windows Users无法正常工作。使用cat /etc/group检查与您应该更换什么Users。例如,在荷兰语中,您必须替换UsersGebruikers
thijsai 2014年

3
它不再起作用了。新的解决方案是@ luke-lee的解决方案。
fjardon

26

从Cygwin 1.7.34(2015-02-04)开始,将群组更改为Users不再有效的方法。相反,您需要使用Cygwin的setfacl实用程序。

  • 说,如果要设置文件模式来644 (rw-r--r--)执行此操作:

    setfacl -s u::rw-,g::r--,o:r-- foo.bar
    
  • 或使用更长的格式:

    setfacl -s user::rw-,group::r--,other::r-- foo.bar
    
  • 或使用getfaclfrom文件将其模式复制foobar

    getfacl foo | setfacl -f - bar
    

Cygwin用户指南“ setfacl”部分中有完整的手册。我想知道为什么Cygwin还没有chmod同样改变实用程序。


1
将组更改为“用户”的解决方案不适用于我,而只能使用基于setfacl的解决方案!
暗淡

2
卢克,我想您在'o'之后的第一个代码块中错过了一个冒号。
SeldomNeedy

@SeldomNeedy Argh!您是正确的,已相应纠正。谢谢!
Luke Lee)

1
@SeldomNeedy经过更多检查后,我发现两种语法都可以,但是原始的(带有一个冒号)更准确。“ u”和“ g”的第二个冒号用于指定UID和GID。对于“ o”,没有这样的说明符,因此只需要一个冒号。
李克利(Luke Lee)

10

这是一个使用Luke Lee的建议但支持chmod之类的八进制参数的脚本。它提供了可以扩展的框架。尽管它目前仅支持修复key.pem和/或〜/ .ssh目录和文件权限所需的八进制args。

#!/bin/bash

# convert chmod octal permission args to equivalent setfacl args
ARGS=() ; FILES=()
while [ $# -gt 0 ]; do
  A=$1 ; shift
  case "$A" in
  600|0600) ARGS+=("u::rw-,g::---,o::---") ;;
  640|0640) ARGS+=("u::rw-,g::r--,o::---") ;;
  644|0644) ARGS+=("u::rw-,g::r--,o::r--") ;;
  700|0700) ARGS+=("u::rwx,g::---,o::---") ;;
  *) if [ -e "$A" ]; then FILES+=( "$A" ) ; else
    echo "unrecognized arg [$A]" 1>&2
    exit 1
  fi
  ;;
  esac
done
for F in "${FILES[@]}" ; do
  setfacl -s "${ARGS[@]}" "$F"
done

我使用它来修复.ssh目录和文件:

chmodfacl 700 ~/.ssh
chmodfacl 600 ~/.ssh/*
chmodfacl 640 ~/.ssh/*.pub

刚刚在cygwin更新中被这一版本击中。感谢您的脚本。setfacl独自是可怕的。
安迪·布朗

我将脚本放在哪里?
西西尔

该脚本可以放在cygwin路径中的任何位置。您可能会创建一个$ HOME / bin目录并将其放置在该目录中,尽管您随后需要将其添加到路径中,例如,在$ HOME / .bashrc中。
philwalk



1

可以通过从cygwin终端运行ssh-keygen命令来解决此问题。(不是正常的Windows命令提示符)。我已经在Windows8机器上完成了此操作。


4
您能否进一步详细说明?如何解决这个问题?除了“从Cygwin运行ssh-keygen”之外,用户应该采取什么步骤?
DanteTheEgregore 2014年

这只是生成一个密钥,但是OP的密钥具有错误的权限
Jonathan

此处的经验相同:chmod / ssh-keygen在cygwin下具有良好的权限,但是如果我从Windows cmd执行它们,则不会这样做。(虽然我不知道为什么:
autra

-2

运行Cygwin安装程序并更新。该错误应已修复。


3
您的帖子需要扩展。一个好的答案包括特定的说明(不仅仅是指向它们的链接),以及有关答案如何或为何解决OP问题的说明。请修改您的帖子以充分解决这两个要素。
Twisty模仿者
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.