題 在Windows 8中使用Cygwin,chmod 600無法按預期工作?


我正在嘗試將權限更改為我的密鑰文件 key.pem 在 Cygwin的 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的問題還是我錯過了什麼?


75
2018-03-05 22:27


起源


這聽起來像Win8 / Cygwin錯誤。我建議在報導上報告 Cygwin郵件列表。 - me_and
它可能與NTFS有關...... Windows並沒有真正使用該Linux方案。也許你可以嘗試進入Windows權限設置,只給自己權利...... - sinni800
我認為這與此有關 superuser.com/questions/363141/... - Daniel Stiner


答案:


我在Win8CP中使用Cygwin,我遇到了同樣的問題。這絕對是一個Cygwin錯誤,但有一個解決方法:嘗試運行:

 chgrp -R Users ~/.ssh

更長的解釋是,出於某種原因,Cygwin的 /etc/passwd 和 /etc/group 生成將用戶的默認/主要組放入 None。你不能改變你的許可 None, 所以 chmod 對於組無效。

我沒有嘗試修復 passwd/group 自己檔案,但我確實做了 chgrp -R Users ~/.ssh (或者,如果您使用的是Windows 8預發行版,則使用組名稱HomeUsers)。在那之後,你可以做到 chmod 0600 它會按預期工作。

chgrp 到了 Users 組可以在您找到的任何其他類似案例中完成。它甚至可以按預期工作,因為Cygwin將用戶放入了 Users 小組作為 次要 組(而不是 ,這將是正確的行為)。


97
2018-04-03 18:58



我需要chgrp -Rv用戶〜/ .ssh / * chmod -vR 600~ / .ssh / * - Tomáš Fejfar
上面的@TomášFejfar評論為我工作。謝謝。 - scaraveos
@TomášFejfar非常有用,也許它應該找到安裝腳本或其他東西 - dashesy
請注意,如果您使用其他語言安裝了Windows Users 不會起作用。使用 cat /etc/group 檢查你應該更換什麼 Users。以荷蘭語為例,你必須更換 Users 同 Gebruikers。 - thijsai
它不再起作用了。新解決方案是@ luke-lee的解決方案。 - fjardon


從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
    
  • 或使用複制其模式 getfacl 從文件 foo 至 bar

    getfacl foo | setfacl -f - bar
    

完整的手冊在 Cygwin用戶指南的“setfacl”部分。我想知道為什麼Cygwin還沒有改變 chmod 實用性同樣。


26
2018-02-12 02:19



組更改為用戶的解決方案對我不起作用,但只有基於setfacl的解決方案! - dim
盧克,我想你在'o'之後的第一個代碼塊中錯過了冒號。 - SeldomNeedy
@SeldomNeedy唉!你是對的,相應地糾正了。謝謝! - Luke Lee
@SeldomNeedy經過一些檢查後我發現兩種語法都有效,但原來的(帶有一個冒號)更準確。 'u'和'g'的第二個冒號用於指定UID和GID。對於'o',沒有這樣的說明符,因此只需要一個冒號。 - Luke Lee


這是一個使用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

10
2018-02-14 15:57



剛剛在cygwin更新中遇到了這個。謝謝你的劇本。 setfacl 靠它自己是可怕的。 - Andy Brown
我在哪裡放腳本? - Sisir
腳本可以在你的cygwin路徑中的任何地方。您可以創建$ HOME / bin目錄並將其放在那裡,但是您需要將其添加到路徑中,例如在$ HOME / .bashrc中。 - philwalk


chgrp -R Users ~/.ssh

chmod 0600 ~/.ssh/config

chmod 0700 ~/.ssh

4
2018-05-26 17:36



這些是我需要的確切步驟,+ 1。 - camomileCase


如果你有 git bash 安裝運行相同的命令(chmod -c 600 key.pem)用git bash並避免 Cygwin的


1
2018-04-26 15:15





可以通過從cygwin終端運行ssh-keygen命令來解決此問題。(不是正常的Windows命令提示符)。我在我的windows8機器上完成了這個。


1
2017-08-08 14:59



你能進一步詳細說明嗎?這怎麼能解決問題呢?除了“從Cygwin運行ssh-keygen”之外,用戶應採取哪些步驟? - DanteTheEgregore
這只是生成一個鍵,但OP有一個權限不好的鍵 - Jonathan
這裡有相同的經驗:chmod / ssh-keygen在cygwin下提供了很好的權限,但是如果我從windows cmd執行它們就不會這樣做。 (我不知道為什麼:-)) - autra


運行Cygwin安裝程序並進行更新。應該修復bug。


-2
2018-06-15 17:52



您的帖子需要擴展。一個好的 回答 包括具體說明(不僅僅是指向它們的鏈接)以及解答如何或為何解決OP問題的解釋。請編輯您的帖子以充分解決這兩個要素。 - Twisty Impersonator