Как изменить владельца файла в Linux?

Ответ

Изменение владельца (ownership) — базовая, но критически важная операция при настройке прав доступа для сервисов и скриптов в DevOps. Использую команду chown (change owner).

Базовый синтаксис:

chown [OPTIONS] NEW_OWNER:NEW_GROUP FILE

Практические примеры из работы:

  1. Настройка веб-сервера: После деплоя кода от пользователя deploy, нужно отдать файлы пользователю www-data, от которого работает Nginx/Apache.

    sudo chown -R www-data:www-data /var/www/my-app/

    Ключ -R рекурсивно меняет владельца для всей директории и её содержимого.

  2. Настройка Docker volume или конфигурации: Если контейнер записывает логи в смонтированный volume от root, а анализировать их нужно другому пользователю.

    sudo chown -R 1000:1000 /host/path/logs/  # 1000 — UID обычного пользователя в контейнере
  3. Смена только владельца или только группы:

    sudo chown jenkins /opt/backup/script.sh  # Меняет только владельца
    sudo chown :ci-team /opt/artifacts/       # Меняет только группу

Важные нюансы для DevOps:

  • Безопасность: Не давать излишних прав (chown root:root для пользовательских скриптов — плохая практика). Использую принцип наименьших привилегий.
  • Идемпотентность в Ansible: В плейбуках для этой задачи использую модуль file:
    - name: Ensure correct ownership for app directory
      ansible.builtin.file:
        path: /opt/app
        owner: appuser
        group: appgroup
        recurse: yes  # Аналог -R
  • Проблемы с символическими ссылками: По умолчанию chown -R меняет владельца самой ссылки, а не целевого файла. Чтобы изменить владельца цели, может потребоваться chown -hR или обход с find.
  • Права sudo: Почти всегда требуется для изменения владельца, если вы не являетесь текущим владельцем файла.

Ответ 18+ 🔞

А, ну вот, классика жанра! Сидишь ты такой, настраиваешь очередной сервис, а он тебе в ответ — «Permission denied». И тут начинается, ёпта, священный ритуал: chown. Без этой команды в девопсе — как без рук, реально. Сейчас разжуём, что к чему.

Базовый синтаксис — проще пареной репы:

chown [OPTIONS] NEW_OWNER:NEW_GROUP FILE

А теперь, как это в жизни выглядит, на реальных костылях:

  1. Веб-сервер настроить. Деплойщик (deploy) закинул файлы, а работать-то должен www-data (Nginx/Apache). Что делаем? Правильно, отбираем и отдаём. Иначе сервис сядет на бутылку и ничего не отдаст.

    sudo chown -R www-data:www-data /var/www/my-app/

    Ключик -R — это святое. Он пройдётся по всем папкам и файлам внутри, чтобы ни одна сволочь не осталась со старыми правами. Без него — доверия ебать ноль, что всё настроится.

  2. Docker volume подружить с логированием. Контейнер от root накидал логов в общую папку, а тебе их смотреть нужно. Берёшь и насильно меняешь хозяина на обычного юзера (например, с UID 1000). Просто хуй с горы — не вариант, права должны быть чёткими.

    sudo chown -R 1000:1000 /host/path/logs/
  3. Меняем что-то одно. Иногда надо только владельца поправить, а группу оставить. Или наоборот — только группу сменить, потому что в ней уже пол-отдела сидит.

    sudo chown jenkins /opt/backup/script.sh  # Меняем только хозяина
    sudo chown :ci-team /opt/artifacts/       # А тут только группу трогаем

А теперь, блядь, важные нюансы, без которых можно влететь по полной:

  • Безопасность, мать её. Это не шутки. Навесить root:root на какой-нибудь левый скрипт — это пидарас шерстяной так поступит. Принцип наименьших привилегий, ёпта! Дай ровно столько прав, сколько нужно для работы, и ни капли больше. Иначе потом будет вам хиросима и нигерсраки от безопасности.

  • В Ansible. Чтобы не дёргать команду каждый раз вручную, используй модуль file. Он идемпотентный — проверит, что уже правильно, и лишний раз не станет трогать. Удобно, чих-пых тебя в сраку.

    - name: Ensure correct ownership for app directory
      ansible.builtin.file:
        path: /opt/app
        owner: appuser
        group: appgroup
        recurse: yes  # Тот самый наш -R
  • Симлинки — хитрая жопа. По умолчанию chown -R поменяет владельца самой ссылки, а не того файла, на который она ведёт. Представляешь? Ссылка новая, а доступ к реальным данным — нуль. Иногда надо chown -hR или через find пройтись, чтобы не облажаться.

  • Права sudo. Тут без вариантов. Если ты не владелец файла, то без sudo команда тебе вежливо, но твёрдо скажет «шёл бы ты на хуй». Запомни это как «Отче наш».

В общем, инструмент простой, но терпения ноль ебать — если накосячить с правами, потом полдня ищешь, почему сервис не стартует. Делай аккуратно.