Chmod не может изменять групповое разрешение на cygwin

Я использую cygwin и пытаюсь изменить разрешение доступа к группе с помощью chmod, например.

$ls -l id_rsa
-rwxrwxr-- 1 None 1679 Jun 13 10:16 id_rsa 

$ chmod g= id_rsa 

$ ls -l id_rsa 
-rwxrwxr-- 1 None 1679 Jun 13 10:16 id_rsa 

Но это не работает. Я могу изменить разрешение для пользователя и других пользователей. Кажется, что уровень разрешений для группы каким-то образом сохраняет то же, что и у пользователя?

Ответ 1

Это может быть поздно, но у меня была схожая проблема, и я использовал файловую систему NTFS, поэтому ответ Кейта Томпсона не разрешил для меня. Я наблюдаю за тем, чтобы другие люди, имеющие проблемы, могли выиграть.

Что я сделал, так это изменение владельца группы файлов в группе "Пользователи":

chown :Users filename

После этого я смог изменить групповые разрешения на мою волю, используя chmod, в моем случае, поскольку это был ключ rsa для openssh, я сделал:

chmod 700 filename

И это сработало. Дело в том, что в Cyqwin вы по умолчанию получаете 2 группы, а группа Root - группа Users. Я хотел добавить другую группу, но я не смог сделать это с помощью инструментов, которые я использовал для использования в Linux. По этой причине я просто использовал группу Users.

Ответ 2

Cygwin не любит файлы, принадлежащие группам, которых он не знает. К сожалению, это часто случается в Cygwin, особенно если ваш компьютер находится в домене Windows, где все меняется. Я также синхронизирую свои файлы между двумя ПК через внешний диск, а uids/gids различаются между разными ПК, поэтому это является источником проблем.

Если вы выполняете ls -l и видите идентификатор числовой группы вместо имени группы, это означает, что Cygwin не знает gid, то есть не в /etc/group, а Cygwin не может запрашивать его из Windows. Вы можете подтвердить это, выполнив getent group <gid>, где <gid> - это идентификатор числовой группы.

Чтобы исправить это, вы можете использовать chgrp для изменения группы для всех затронутых файлов/каталогов, как описано в принятом ответе выше, или создать запись для неизвестного gid в /etc/group, с любой неиспользуемой группой name (например, Users2).

После этого может потребоваться закрыть все окна Cygwin, а затем снова открыть их.

Ответ 3

Эксперимент показывает, что chmod корректно работает для изменения групповых разрешений в Cygwin.

В эксперименте использовался файл в разделе NFTS. Cygwin реализует уровень POSIX поверх Windows, но в конечном итоге он использует функции самой Windows и конкретной реализации файловой системы. В современных версиях Windows большинство жестких дисков отформатированы для использования NTFS, что обеспечивает достаточную поддержку chmod. Но внешние USB-накопители обычно используют FAT32, который не имеет одинаковых возможностей для представления разрешений. Слой Cygwin подделывает семантику POSIX, а также может, но ее можно сделать только так.

Try

$ df -T .

Если это означает, что вы используете файловую систему FAT32, возможно, проблема. Решение состояло в том, чтобы сохранить файл в файловой системе NTFS. Файл с именем id_dsa, вероятно, является закрытым ключом ssh, все равно должен храниться в $HOME/.ssh. Является ли ваш домашний каталог на разделе FAT32? Насколько я помню, последние версии Windows ( "последние", означающие последние 10 или более лет) способны конвертировать файловые системы FAT32 в NTFS.


Остальная часть этого ответа была в ответ на исходную версию вопроса, в которой была опечатка в команде chmod. Я оставляю это сейчас, потому что информация может быть полезной для кого-то.


Cygwin использует версию GNU Coreutils chmod. Это:

chmod g=0 fileName

не является правильным синтаксисом. Я получаю:

$ chmod g=0 fileName
chmod: invalid mode: `g=0'
Try `chmod --help' for more information.

(Это на Linux, а не на Cygwin, но оно должно быть одинаковым.)

Чтобы отключить все групповые разрешения, это должно работать:

$ chmod g= fileName
$ ls -l fileName 
-rw----r-- 1 kst kst 0 Jun 13 10:31 fileName

Чтобы просмотреть документацию chmod:

$ info coreutils chmod

Чтобы просмотреть документацию в режиме символического файла:

$ info coreutils Symbolic

Формат символических режимов:

 [ugoa...][+-=]PERMS...[,...]

где PERMS - это либо ноль, либо больше букв из набора 'rwxXst', или одна буква из набора 'ugo'.

Ответ 4

Как и выше, не распознанные группы вызывают такие проблемы. В основном это происходит в Windows-доменах. Самый простой способ исправить это - восстановить /etc/passwd и/etc/group (параметр -d необходим для пользователей домена)

mkpasswd -l -d > /etc/passwd
mkgroup  -l -d > /etc/group

Закройте и снова запустите cygwin.

Ответ 5

Это очень раздражающая проблема для меня. В моем случае решение user135348 работало лучше всего. Самая большая проблема с приемом chown: Users -R заключается в том, что каждый раз, когда создается новый файл, он будет назначен неизвестному gid 1049120. Его очень сложно продолжать изменять файл gid.

Я тоже пробовал mkgroup, в моем случае это не сработало: мой gid - 1049120. На основе правил, описанных здесь https://cygwin.com/cygwin-ug-net/ntsec.html#ntsec-mapping-how:: смещение 0x100000 используется для учетной записи из основного домена машины. Пытаясь удалить такое же смещение от 1049120, вы получите 544, который является встроенной группой RID администраторов.

Эта учетная запись не является членом локальной группы администраторов. Мы используем SuRun для предоставления прав администратора без предоставления учетных данных.
В этом случае mkgroup не смог создать все возможные значения.

Редактирование группового файла и добавление индивидуального имени группы всегда легко устраняют проблему.

Ответ 6

Была ли эта проблема при удаленной работе с Доменом и с использованием cygserver.

Запуск ls -l показал идентификатор числовой группы вместо имени группы.

Я остановил cygserver net stop "CYGWIN cygserver и другие процессы cygwin, а затем снова запустил ls -l, тогда имена групп были правильно отображены.

Я предполагаю, что cygserver хранит неполную информацию о группе домена.

После перезагрузки cygserver система продолжала работать правильно.

Ответ 7

Необходимо указать имя группы в системе Windows, которой принадлежит ваш пользователь.
Поэтому я просто сделал это: chown -R ONEX:Users ~/*

Вы можете найти свое имя пользователя и группу здесь:
image