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 

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

8 ответов

Решение

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

Я изменил владельца группы файла на Users группа:

chown :Users filename

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

chmod 700 filename

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

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

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

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

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

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

В эксперименте использовался файл в разделе NTFS. Cygwin реализует слой POSIX поверх Windows, но в конечном итоге он все же использует возможности самой Windows и конкретной реализации файловой системы.

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

Пытаться

$ 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'.

Как и в предыдущих ответах, такие проблемы возникают не у распознанных групп. В основном это происходит в доменах Windows.

Самый простой способ исправить это восстановить /etc/passwd а также /etc/group файлы (параметр -d требуется для пользователей домена):

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

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

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

Я старался mkgroup тоже, но в моем случае это не сработало: у меня 1049120.

На основе правил, описанных в разделе Сопоставление идентификаторов SID Windows со значениями uid / gid POSIX: смещение 0x100000 используется для учетной записи из основного домена компьютера. Пытаясь удалить то же смещение из 1049120, вы получаете 544, который является RID встроенной группы администраторов.

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

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

      #!/bin/bash

find . |while read obj; do
  if [[ -d "$obj" ]]; then
    setfacl --set "user::rwx,group::r-x,other::r-x" "${obj}"
  elif [[ -f "$obj" ]]; then
    setfacl --set "user::rw-,group::r--,other::r--" "${obj}"
  fi
done

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

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

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

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

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

Вы должны указать имя группы в системе Windows, к которой принадлежит ваш пользователь.

Так что я просто сделал это: chown -R ONEX:Users ~/*

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

Образ

Другие вопросы по тегам