Debian Debian 12Debian 13

Debian Linux: после смены пользователя ломаются права на сокет

  • Обновлено
  • Чтение ≈ 4 минуты
  • Нужны права администратора

Краткий ответ

После перевода Debian-сервиса на отдельного пользователя клиентская программа перестаёт подключаться к UNIX-сокету: журнал сообщает Permission denied или Connection refused. Сокет может быть обычным файлом процесса или управляться отдельным socket-unit systemd.

В этой статье
  1. Когда возникает ошибка в Debian и какие условия важны
  2. Причины и как отличить их друг от друга
  3. Пошаговая диагностика и устранение
  4. Проверка результата и действия при неуспехе

#Когда возникает ошибка в Debian и какие условия важны

После перевода Debian-сервиса на отдельного пользователя клиентская программа перестаёт подключаться к UNIX-сокету: журнал сообщает Permission denied или Connection refused. Сокет может быть обычным файлом процесса или управляться отдельным socket-unit systemd.

#Причины и как отличить их друг от друга

Возможная причинаКак узнатьЧто делать
Владелец сокета больше не совпадаетls -l показывает прежнего пользователя/группу.Проверить режим доступа и способ создания сокета.
Нет права прохода к родительскому каталогуСам сокет имеет разрешения, но namei -l выявляет закрытый каталог.Изменить только требуемый каталог или RuntimeDirectory.
Сокет остался после сбоя, но никто не слушаетФайл существует, однако ss -xl не показывает слушающий процесс.Проверить socket-unit и процесс, не удалять объект вслепую.

#Пошаговая диагностика и устранение

  1. 1. Уточните полный путь сокета и точный код ошибкиОткройте терминал Debian, найдите в конфигурации приложения полный путь /run/имя/имя.sock. Если известен лишь Connection refused, нужно проверить, запущен ли владелец сокета, а не менять права. Запишите имя исходного пользователя и новой учётной записи.
  2. Чтение данных и диагностика
    Linux · Терминал (Bash)Команда
    Чтение данных и диагностика. Изменений нет.
    systemctl status ИМЯ.service --no-pager
    journalctl -u ИМЯ.service -b --no-pager -n 90
  1. 2. Определите, кто создаёт сокетВыполните ss -xlpn для локальных UNIX-сокетов. Если отдельный объект .socket активен, изучите его параметры SocketUser, SocketGroup, SocketMode и ListenStream. Обычный файл сокета в /run может исчезать при перезагрузке; создание вручную не является исправлением.
  2. Команды только смотрят слушателей и объекты
    Linux · Терминал (Bash)КомандаНужен sudo
    Команды только смотрят слушателей и объекты.
    sudo ss -xlpn
    systemctl list-units --type=socket --all --no-pager
  1. 3. Проверьте владельца конечного объекта и папокУкажите настоящий путь. ls -l покажет тип s для сокета, а namei -l — разрешения на всех уровнях каталога. Если есть ACL, обычных прав может быть недостаточно для объяснения доступа. Не выполняйте chmod 777, особенно в общих каталогах /tmp.
  2. Чтение данных и диагностика
    Linux · Терминал (Bash)Команда
    Чтение данных и диагностика. Изменений нет.
    ls -l /run/ПАПКА/ИМЯ.sock
    namei -l /run/ПАПКА/ИМЯ.sock
  1. 4. Сопоставьте системного пользователя и группыПроверьте id новой учётной записи и unit приложения, находящегося по обе стороны соединения. Добавление пользователя в существующую группу даёт дополнительные права не только на данный сокет; предпочтительнее отдельная служебная группа с минимальным доступом, если это поддерживается приложением.
  2. Чтение данных и диагностика
    Linux · Терминал (Bash)Команда
    Чтение данных и диагностика. Изменений нет.
    id ПОЛЬЗОВАТЕЛЬ
    systemctl show ИМЯ.service -p User -p Group -p SupplementaryGroups
  1. 5. Найдите источник разрешений и пересоздания сокетаДля systemd socket-unit посмотрите его файл и параметры режима; при обычном приложении изучайте настройки самого приложения, создающего сокет. Удаление файла /run/*.sock вручную при работающем процессе может нарушить соединения. Стандартный способ — исправить постоянную настройку и штатно перезапустить владельца.
  2. Чтение данных и диагностика
    Linux · Терминал (Bash)Команда
    Чтение данных и диагностика. Изменений нет.
    systemctl cat ИМЯ.socket
    systemctl cat ИМЯ.service
  1. 6. Проверьте каталог времени исполненияЕсли служба использует RuntimeDirectory=, systemd может создавать папку под правильным владельцем и с заданным режимом при старте. Посмотрите значения через show; это надёжнее, чем вручную менять права на каталоги /run после каждой загрузки. Для сокета со сторонним создателем механизм может отличаться.
  2. Чтение данных и диагностика
    Linux · Терминал (Bash)Команда
    Чтение данных и диагностика. Изменений нет.
    systemctl show ИМЯ.service -p RuntimeDirectory -p RuntimeDirectoryMode -p User -p Group
  1. 7. Проверяйте соединение от нужного пользователяПосле адресной правки настроек перезапустите только соответствующую службу и проверьте статус socket и возможность подключения штатным клиентом. Если Permission denied исчезло, но есть Connection refused, проверьте слушателя через ss, а не добавляйте новые полномочия.
  2. Если отдельный .socket не существует, его status вернёт not found — это нормально
    Linux · Терминал (Bash)КомандаНужен sudo
    Если отдельный .socket не существует, его status вернёт not found — это нормально.
    sudo ss -xlpn
    systemctl status ИМЯ.socket --no-pager
    systemctl status ИМЯ.service --no-pager

#Проверка результата и действия при неуспехе

Успех — клиент с минимально достаточными полномочиями подключается к UNIX-сокету после перезапуска и перезагрузки, а владелец файла создаётся корректно автоматически.

Так эту ошибку тоже называют

Источники и обновления

Последнее обновление статьи: 2 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.