Ошибка «Permission denied» при открытии /dev/ttyUSB0 или /dev/ttyACM0 в Arduino IDE, minicom или PuTTY почти всегда означает одно: ваш пользователь не входит в группу dialout, которой принадлежат файлы последовательных портов в Linux. Команда sudo usermod -aG dialout $USER решает эту проблему, добавляя текущего пользователя в нужную группу.
Ниже разберём, что именно делает эта команда, почему после её выполнения нужно перезайти в систему, как проверить результат и что делать, если доступ к порту так и не появился. Материал актуален для Ubuntu, Debian, Linux Mint и других систем, где последовательные порты управляются через группу dialout.
Что делает команда sudo usermod -aG dialout
Команда состоит из нескольких частей, и каждая из них важна. usermod — утилита для изменения параметров учётной записи пользователя. Ключ -a означает append, то есть добавление к существующим группам, а -G задаёт список дополнительных групп. Вместе -aG dialout добавляет пользователя в группу dialout, не удаляя его из остальных групп.
Группа dialout исторически отвечает за доступ к последовательным портам (COM-портам). В современных системах сюда попадают и USB-to-Serial адаптеры на чипах CH340, CP2102, FTDI, а также платы Arduino и ESP32, которые при подключении создают устройства вида /dev/ttyUSB0 или /dev/ttyACM0.
Посмотреть, какая группа владеет портом, можно так:
ls -l /dev/ttyUSB0
Типичный вывод выглядит как crw-rw---- 1 root dialout .... Это значит: читать и писать в порт может только root и члены группы dialout. Если вашего пользователя в этой группе нет — программа получит отказ в доступе.
Пошаговая инструкция по применению
Выполните команду, подставив своё имя пользователя или переменную окружения:
sudo usermod -aG dialout $USER
Переменная $USER автоматически подставляет имя текущего пользователя, поэтому команда универсальна. Если нужно добавить другого пользователя, укажите его имя явно: sudo usermod -aG dialout ivan.
⚠️ Внимание: никогда не выполняйтеusermod -G dialout userбез ключа-a. Без него команда заменит весь список дополнительных групп пользователя на одну dialout, и вы потеряете, например, членство в группе sudo — восстанавливать доступ придётся из-под другой учётной записи.
Изменения групп применяются только при новом входе в систему. Просто закрыть терминал недостаточно — нужно полностью выйти из сессии и войти заново, либо перезагрузить компьютер.
☑️ Добавление пользователя в группу dialout
Проверка результата
Самый быстрый способ убедиться, что всё сработало, — команда groups. Она выведет список групп текущего пользователя, и среди них должна быть dialout.
Альтернативные способы проверки:
- 🔍
id— покажет UID, основную и дополнительные группы пользователя; - 📋
getent group dialout— выведет всех членов группы dialout; - 🔌
ls -l /dev/ttyUSB0— сверьте группу владельца порта с выводом предыдущих команд.
Если dialout в списке групп отсутствует, значит, вы не перезашли в систему после выполнения usermod. Это самая частая причина «неработающей» команды.
Типичные ошибки и их решения
Даже после добавления в группу доступ к порту иногда не появляется. Вот распространённые причины и способы диагностики.
| Симптом | Возможная причина | Что проверить |
|---|---|---|
| Permission denied после usermod | Сессия не перезапущена | Вывод команды groups |
| Порт /dev/ttyUSB0 не появляется | Не загружен драйвер или кабель «только питание» | Вывод dmesg после подключения |
| Порт занят другой программой | Модем-менеджер или другой процесс держит порт | sudo lsof /dev/ttyUSB0 |
| Группа порта не dialout | Правила udev назначают другую группу | Вывод ls -l на файл устройства |
| Ошибка «usermod: user does not exist» | Опечатка в имени пользователя | Команда whoami |
Отдельного упоминания заслуживает ModemManager: в некоторых дистрибутивах он автоматически захватывает новые последовательные порты, пытаясь определить модем. Для плат Arduino и ESP32 это мешает — программа прошивки не может открыть порт. Если lsof показывает, что порт занят именно ModemManager, и модемами вы не пользуетесь, службу можно остановить: sudo systemctl stop ModemManager.
⚠️ Внимание: запускать Arduino IDE, minicom или другие программы через sudo ради доступа к порту — плохая практика. Файлы проектов и настройки начнут создаваться от root, что позже вызовет новые конфликты прав. Правильное решение — именно группа dialout.
Другие полезные группы для работы с устройствами
Группа dialout — не единственная, которая может понадобиться при работе с оборудованием в Linux. В зависимости от задачи пользователя добавляют и в другие группы:
- 💾 disk — низкоуровневый доступ к дискам (давать её обычному пользователю небезопасно);
- 🔌 plugdev — работа со съёмными устройствами, часто используется для adb и программаторов;
- 🖥️ tty — доступ к терминальным устройствам, требуется редко;
- 🐳 docker — управление контейнерами без sudo.
Принцип везде одинаковый: sudo usermod -aG имя_группы имя_пользователя, затем повторный вход в систему. Ключ -a обязателен при любом добавлении в группу — без него вы затрёте все остальные группы пользователя.
Почему группа называется dialout
Название уходит корнями в эпоху телефонных модемов: dial-out — «исходящий звонок» через последовательный порт. Модемы давно ушли в прошлое, а имя группы осталось и теперь покрывает все последовательные интерфейсы, включая USB-UART переходники.
Как отозвать доступ и удалить пользователя из группы
Если доступ к последовательному порту больше не нужен — например, вы настраивали чужой компьютер или выдаёте права временно, — пользователя можно исключить из группы. Для этого используется утилита gpasswd:
sudo gpasswd -d ivan dialout
Как и при добавлении, изменение вступит в силу после нового входа пользователя в систему. Проверить результат можно командой getent group dialout — имени в списке быть не должно.
На серверах и общих машинах имеет смысл периодически просматривать состав группы: лишний пользователь с доступом к портам теоретически может читать данные, которые устройство передаёт через последовательный интерфейс.
Часто задаваемые вопросы
Чем отличается -aG от -G в команде usermod?
Ключ -G задаёт полный список дополнительных групп, заменяя старый. Ключ -a (append) вместе с -G добавляет группу к существующему списку. Для добавления в dialout всегда используйте связку -aG.
Команда выполнена, но Arduino IDE всё равно не видит порт. Что делать?
Сначала убедитесь, что вы полностью вышли из системы и вошли снова, затем проверьте вывод groups. Если dialout там есть, посмотрите dmesg сразу после подключения платы — возможно, проблема в кабеле или драйвере, а не в правах.
Нужно ли добавлять пользователя в dialout для /dev/ttyACM0?
Да, в большинстве дистрибутивов устройства /dev/ttyACM* (платы Arduino Uno, Leonardo и подобные) также принадлежат группе dialout. Проверить можно командой ls -l /dev/ttyACM0.
Можно ли обойтись без группы dialout?
Технически можно изменить права через правила udev или запускать программы от root, но оба способа хуже: первый требует написания конфигурации, второй небезопасен. Членство в группе — штатный и самый простой механизм.
Как узнать, в каких группах уже состоит пользователь?
Выполните groups имя_пользователя или просто id для текущей учётной записи. Обе команды выведут основную и все дополнительные группы.