Почему я получаю отказ в разрешении при использовании mv, хотя права на каталог верны?

13

Мне было отказано в разрешении при попытке переместить папку Musicчерез, mvхотя для владельца каталога установлено значение «Мой пользователь», а для разрешения пользователя установлено значение 7. Что происходит?

(Я знаю, что могу использовать sudo, но я хочу выяснить, в чем дело. Здесь что-то пахнет подозрительно). PS: я на Mac OS X El Capitan.

Скриншот терминала

Timo
источник
1
Любой, кто сталкивается с той же ошибкой, может быть потому, что вы пытаетесь просмотреть открытый файл. Хотя не в случае с ОП, просто скажу, что это может помочь.
aderchox

Ответы:

20

Обратите внимание , что, когда в папке a, перемещаясь bк c, разрешения папки aопределить , что вы можете сделать.

В этом случае права доступа .будут наиболее важными.

Обратите внимание, что разрешения являются более сложными, чем просто rwx. Ваша musicпапка имеет @в конце, .папка имеет +в конце.

  • Используется xattr -hдля определения сложных разрешений для символа @.
  • Используйте getfaclдля определения ACL для символа +.
Konerak
источник
Есть ли у вас ресурс, который охватывает "сложные разрешения", как вы их называете?
user1717828
man xattrможет быть хорошей отправной точкой.
Конерак
1
Нет, нет ручного ввода. Я смог найти в Google другое название: расширенные атрибуты , если кто-то еще хочет узнать больше.
user1717828
4
Или используйте ls -la@e. Скорее всего, здесь были deny deleteACL, которые также препятствуют переименованию.
Стефан Шазелас
1
@Timo, эти ACL-списки не позволяют удалять или переименовывать эти каталоги. Предположительно, они были помещены туда по какой-то причине, так как некоторые приложения полагаются на то, что они там, и в противном случае потерпят неудачу.
Стефан Шазелас
19

Я использовал подсистему Windows для Linux. У меня был каталог, открытый в другом экземпляре bash. Закрытие позволяет мне переместить каталог.

Крис Андерсон
источник
4
В VS Code с удаленным доступом на WSL мне пришлось закрыть редактор и открыть терминал для WSL вне этого проекта VS Code.
Бьорн
9

Похоже, что где-то глубоко в этом каталоге был хотя бы один файл, у которого не было необходимых прав доступа.

Итак, что я сделал:

sudo chown -R valmar ./Music
sudo chmod -R 755 ./Music

Теперь это работает.

Timo
источник
17
Какова бы ни была проблема, предоставление разрешения на исполнение музыкальным файлам не должно быть решением.
Стефан Шазелас
3
И кажется маловероятным, что объект в каталоге может помешать вашей способности переименовать этот каталог.
Скотт
Я знаю, что это странно, но это помогло. Использование chmod и chown для самого каталога не дало никаких результатов.
Тимо
Возможно ли, что chmod 755удалены специальные разрешения «@» для папки «Музыка»?
HorusKol
@HorusKol, или чоун. Симптомы OP будут соответствовать каталогам, имеющим запрещающие удаление ACL, но, по крайней мере, в Yosemite выполнение chown или chmod 755 не удаляет этот ACL. Вам нужно chmod -a 'everyone deny delete' Musicдля этого. В Эль-Капитане все может быть по-другому.
Стефан Шазелас
4

Проблема здесь, вероятно, связана со списком контроля доступа (ACL) папки «Музыка». ACL - это отдельная система разрешений для обычных POSIX, которые обычно перечислены в ls -l. Некоторые другие каталоги в домашней папке и в других местах также имеют списки ACL.

Чтобы увидеть ACL в домашнем каталоге, используйте:

/bin/ls -le ~

Скорее всего, вы увидите правило, похожее 0: group:everyone deny deleteна каталог «Музыка». Как вы заметили, вы можете решить проблему с sudo. Если вы не хотите этого делать (или не можете), у вас есть другие варианты, если вы являетесь владельцем файла. Вы можете удалить поврежденную запись из ACL каталога Music, основываясь на его индексе (0 в приведенном выше примере):

/bin/chmod -a# 0 Music

Или вы можете удалить все записи в ACL:

/bin/chmod -N Music

Теперь вы можете перемещать каталог (с учетом обычных разрешений POSIX). Если вы хотите вернуть ACL после перемещения, вы можете использовать:

/bin/chmod +a "group:everyone deny delete" Music_tmp

И используйте /bin/ls -leснова, чтобы подтвердить, что ACL соответствует вашему желанию. Проверьте примеры ACL в man chmodдля получения дополнительной информации. В частности, это введение полезно:

Каждый файл имеет один ACL, содержащий упорядоченный список записей. Каждая запись относится к пользователю или группе и предоставляет или запрещает набор разрешений. В случаях, когда пользователь и группа существуют с одним и тем же именем, имени пользователя / группы может быть добавлено префикс «user:» или «group:», чтобы указать тип имени.

Заказ ACL

Я не думаю, что эта страница руководства объясняет правила заказа, но эта страница четко объясняет правила заказа для ACL. В частности, явное denyправило будет применено перед явным allowправилом. Таким образом, пока group:everyone deny deleteзапись существует, вы не можете дать своему пользователю разрешение на удаление с помощью allowправила. Это связано с тем, что в everyoneгруппе, в которую входят вы, отказано в разрешении , и это правило будет применено в первую очередь.

раскрутить
источник
2
Я не знаю, почему это было понижено. Запись everyone deny deleteACL в домашних каталогах по умолчанию в macOS является реальной причиной, по которой каталоги нельзя ни перемещать, ни удалять. (Также учтите, что ОС может их воссоздать в любое время.)
Дити
1
этот ответ ROCKED !!! черт возьми, эти новые ACL являются ОГРОМНОЙ ПИТА.
Дин Хиллер,
3

У меня была эта проблема, когда набор программ работал в каталоге, который я пытался удалить. Чтобы переместить каталог, мне пришлось сначала убить все запущенные программы из этого каталога.

В следующих командах будьте очень внимательны при выборе имени вашей программы. Я использовал следующие команды, для справки:

ps aux | grep -i [NAME_OF_ANNOYING_PROGRAM] | grep -v grep
# make sure that you are only about to kill the programs you want to kill

ps aux | grep -i [NAME_OF_ANNOYING_PROGRAM] | grep -v grep | awk '{print $2}' | sudo xargs kill -9
sudo mv /usr/local/[DIR_FOR_ANNOYING_PROGRAM] /usr/local/[DIR_FOR_ANNOYING_PROGRAM]2

Общая процедура:

  1. убить все программы, запущенные из рассматриваемого каталога
  2. попытка переименовать каталог
  3. если это не удастся, принудительно убить ( kill -9с большой осторожностью ) все программы из каталога
  4. попытка переименовать каталог
  5. если это не удается, посмотрите, не запускается ли программа снова, т.е. она была перезапущена какой-либо программой-демоном, запущенной из другого каталога
  6. принудительно убить программу-демон, которая перезапускает надоедливую программу
  7. принудительно убить надоедливую программу
  8. переименовать каталог
  9. прибыль
WattsInABox
источник
1
Я не думаю, что OP, скорее всего, имеет какие-либо программы, запущенные из каталога ~ / Music. Во всяком случае, он сказал, что не хочет использовать sudo, что делает этот ответ.
раскрутка
Я всего лишь говорю, что у меня была такая ситуация. Может быть полезным для кого-то, даже если это не помогло ОП.
WattsInABox
Это может быть полезно для кого-то, конечно - вот почему я не понизил. Но я думаю, что намерение StackExchange заключается в том, чтобы опубликованные ответы действительно отвечали на заданный вопрос.
раскрутка
1
Еще одна потенциальная проблема, если вы хотите, чтобы этот ответ был общедоступным для новичка: вы не предоставляете никаких предупреждений об очень тщательном выборе условий поиска grepи их проверке. Все , что вы кладете в к тому , что первое grepбудет выбирать из пула всех запущенных программ и killего привилегии суперпользователя ...
раскрутка
1
Хорошо, @Watts, я думаю, что это большое улучшение
раскрутка
0

Это также может произойти, когда один из файлов внутри защищен от записи. У меня был крайний случай сегодня, когда access.logбыл защищен от записи в Apache, который уже был остановлен. Я просто удалил этот файл, поэтому в дальнейшем я смог переместить родительский каталог.

vintproykt
источник