Чому мені отримують відмову в дозволі під час використання mv, хоча права каталогів є правильними?


14

Я отримую дозвіл відмовлено при спробі переміщення папки Musicчерез, mvхоча власник каталогу встановлений на мого користувача, а дозволи користувачів встановлені на 7. Що відбувається?

(Я знаю, що я міг би використовувати судо, але хочу дізнатися, що не так. Тут щось пахне рибкою). Ps: Я на Mac OS X El Capitan.

Скріншот терміналу


1
Хто-небудь натикається на ту ж помилку, це може бути тому, що ви намагаєтесь mv відкрити файл. Однак справа не в операційній програмі, просто кажу, що це може допомогти.
aderchox

Відповіді:


21

Зверніть увагу, що, aпереходячи bдо cпапки, дозволи дозволу на папку aвизначають, що ви можете зробити.

У цьому випадку дозволи на .найважливіші.

Зауважте, що дозволи більш складні, ніж просто rwx. У вашій musicпапці є @кінець, у кінці - .папка +.

  • Використовуйте xattr -hдля визначення складних дозволів для символу @.
  • Використовуйте getfaclдля визначення ACL для символу +.

Чи є у вас ресурс, який охоплює "складні дозволи", як ви їх називаєте?
користувач1717828

man xattrможе бути гарною відправною точкою.
Конерак

1
ні, немає ручного введення. Мені вдалося Google навколо знайти інше ім’я: розширені атрибути , якщо хтось інший хоче дізнатися більше.
користувач1717828

4
Або використовувати ls -la@e. Швидше за все, тут був deny deleteACL, який також перешкоджає перейменуванню.
Стефан Шазелас

1
@Timo, ці списки ACL перешкоджають видаленню або перейменуванню цих каталогів. Імовірно, їх помістили туди не так, як деякі додатки покладаються на те, що вони там є, і в іншому випадку вони не зможуть.
Стефан Шазелас

19

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


4
У коді VS з дистанційним на WSL мені довелося закрити редактор і відкрити термінал для WSL за межами проекту VS Code.
Бьорн

9

Схоже, що десь глибоко в цьому каталозі був принаймні 1 файл, який не мав правильних дозволів.

Отже, що я зробив:

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

Зараз це працює.


17
Яка б проблема не була, надання дозволу на виконання музичних файлів не повинно бути рішенням.
Stéphane Chazelas

3
І здається малоймовірним, що об’єкт у каталозі може заважати вашій здатності перейменовувати цей каталог.
Скотт

Я знаю, що це дивно, але це зробило трюк. Використання chmod та chown у самому каталозі не мало ефекту.
Тимо

можливо, chmod 755вилучили спеціальні дозволи "@" у папці "Музика"?
HorusKol

@HorusKol, або чуун. Симптоми ОП відповідали б каталогів, які мають заперечення видалення 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 музичного каталогу, виходячи з його індексу (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

Я не думаю, що "man man" пояснює правила щодо замовлення, але ця сторінка чітко пояснює правила замовлення ACL. Зокрема, перед явним denyправилом буде застосовано явне allowправило. Отже, доки group:everyone deny deleteзапис введено, надати користувачеві дозвіл на видалення за допомогою allowправила неможливо . Це тому, що в дозволі відмовлено everyoneгрупі, до якої ви входили, і це правило буде застосовано спочатку.


2
Я не знаю, чому це було знято. Запис everyone deny deleteACL в домашніх каталогах за замовчуванням macOS є фактичною причиною того, що каталоги не можна ні переміщувати, ні видаляти. (Крім того , не відзначити , ОС може відтворити їх в будь-який час.)
Діті

1
ця відповідь РЕКЛАДЕН !!! святе лайно, ці нові 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. прибуток

1
Я не думаю, що в ОП, ймовірно, є програми, запущені з каталогу ~ / Music. У всякому разі, він сказав, що не хоче використовувати судо, що ця відповідь і робить.
спінуп

Все, що я говорю, - у мене була така ситуація. Може бути корисним комусь, хоча це не було корисно для ОП.
WattsInABox

Можливо, комусь це корисно, звичайно, - тому я не виступав проти. Але я думаю, що намір StackExchange полягає в тому, щоб опубліковані відповіді насправді відповідали на поставлене питання.
спінуп

1
Ще одне потенційне питання, якщо ви хочете, щоб ця відповідь була загальнокорисною для початківців: ви не надаєте жодних попереджень щодо вибору пошукових термінів дуже ретельно в першій grepі перевірки її. Що б ви не вступали в цей перший grep, вибиратимете з пулу всіх запущених програм і killце з привілеями root ...
спінуп

1
Приємно, @ Ваттс, я думаю, що це велике поліпшення
спініп

0

Це також може статися, коли один із файлів всередині захищений від запису. У мене був крайній випадок сьогодні, коли access.logзахищено запис Apache, яке вже було зупинено. Я просто видалив цей файл, тому далі я зміг перемістити батьківський каталог.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.