Файл /etc/shells в Unix-системах¶
/etc/shells — это системный конфигурационный файл в операционных системах семейства Unix и Linux, содержащий список допустимых командных оболочек (shell), которые могут быть назначены пользователям в качестве их регистрационной оболочки. Файл используется системными службами и утилитами для проверки того, является ли указанная оболочка легитимной и разрешённой к использованию.
¶Назначение и функции
Основная функция файла /etc/shells заключается в предоставлении системным программам эталонного списка оболочек, которые считаются корректными для входа в систему. При этом файл не является обязательным для работы ядра операционной системы — ядро не читает его напрямую. Однако многие пользовательские и административные утилиты обращаются к нему для принятия решений.
К числу программ, использующих /etc/shells, относятся:
- chsh — утилита для смены пользователем своей регистрационной оболочки. Она проверяет, что новая оболочка присутствует в списке, иначе выдаёт ошибку.
- chfn — утилита для изменения информации о пользователе (GECOS-поля).
- ftp-серверы (например, vsftpd) — используют список для ограничения доступа: пользователям с оболочками, отсутствующими в /etc/shells, может быть запрещён вход по FTP.
- Службы POP3/IMAP — аналогично могут отклонять подключения для пользователей с нестандартными оболочками.
- sudo — при определённых настройках проверяет оболочку пользователя.
- Программы, работающие с учётными записями, такие как useradd и usermod, могут использовать файл как справочник.
Проверка наличия оболочки в /etc/shells позволяет системе отличать реальных пользователей от системных учётных записей. Например, если у системного пользователя установлена оболочка /sbin/nologin или /bin/false (которые часто не включаются в список), то такому пользователю будет отказано в интерактивном входе и доступе к сетевым сервисам.
¶Формат файла
Файл /etc/shells представляет собой обычный текстовый файл. Каждая строка содержит полный путь к одной командной оболочке. Строки, начинающиеся с символа решётки (#), считаются комментариями и игнорируются. Пустые строки также не обрабатываются.
Типичное содержимое файла в дистрибутиве Linux выглядит следующим образом:
```
¶/etc/shells: valid login shells
/bin/sh /bin/bash /usr/bin/bash /bin/rbash /usr/bin/rbash /usr/bin/sh /bin/dash /usr/bin/dash /usr/bin/zsh ```
В системах BSD, включая macOS, файл может содержать дополнительные пути, например:
`` /bin/sh /bin/csh /bin/ksh /bin/zsh /bin/bash ``
Важно, что файл не является исполняемым и не требует установки прав на выполнение. Обычно он принадлежит пользователю root и имеет права доступа 644 (чтение для всех, запись только для владельца).
¶Поведение при отсутствии файла
Если файл /etc/shells отсутствует в системе, поведение утилит может различаться в зависимости от реализации. Некоторые программы, такие как chsh, могут работать в «небезопасном» режиме, позволяя пользователю устанавливать любую оболочку, либо, наоборот, полностью запрещать смену оболочки. В большинстве современных дистрибутивов Linux файл создаётся автоматически при установке базового набора пакетов и присутствует по умолчанию.
В некоторых реализациях, если файл отсутствует, chsh разрешает изменение оболочки только для пользователя root. Это сделано в целях безопасности, чтобы предотвратить назначение пользователям произвольных программ в качестве оболочки.
¶Взаимодействие с другими файлами
/etc/shells тесно связан с файлом /etc/passwd, в котором хранится информация об учётных записях пользователей, включая поле с путём к регистрационной оболочке. При создании новой учётной записи утилита useradd по умолчанию назначает оболочку, указанную в настройках (обычно /bin/bash или /bin/sh), и эта оболочка должна присутствовать в /etc/shells для корректной работы.
Также файл связан с переменной окружения SHELL, которая устанавливается при входе пользователя в систему и содержит путь к его текущей оболочке. Однако переменная SHELL не обязана быть указана в /etc/shells — она отражает фактический запущенный процесс.
¶Особенности в различных системах
¶Linux
В дистрибутивах Linux файл управляется пакетным менеджером. При установке оболочки (например, zsh или fish) пакет автоматически добавляет путь к ней в /etc/shells через сценарии сопровождения пакета. Администратор может вручную редактировать файл, добавляя или удаляя записи.
¶FreeBSD и другие BSD
В системах BSD файл также присутствует, но его формат и поведение могут незначительно отличаться. Например, во FreeBSD файл создаётся при первоначальной установке, и в него включаются оболочки, поставляемые с базовой системой.
¶macOS
В macOS файл /etc/shells существует и содержит список оболочек, доступных для пользователей. По умолчанию в него включены /bin/bash, /bin/zsh, /bin/sh, /bin/csh, /bin/ksh и другие. Начиная с macOS Catalina (10.15), системной оболочкой по умолчанию стал zsh, однако bash остаётся доступным для обратной совместимости.
¶Windows (WSL)
В подсистеме Windows для Linux (WSL) файл /etc/shells также присутствует внутри дистрибутива и работает аналогично обычной Linux-системе.
¶Безопасность и ограничения
Наличие файла /etc/shells играет важную роль в обеспечении безопасности. Если бы файл отсутствовал, пользователи могли бы назначить себе в качестве оболочки любую программу, например интерпретатор Python или редактор, что потенциально создаёт риски при взаимодействии с сетевыми сервисами.
Системные учётные записи, такие как daemon, bin, adm, часто имеют оболочку /usr/sbin/nologin или /bin/false. Эти пути обычно не включаются в /etc/shells, поэтому попытка входа под такими пользователями через FTP или SSH будет отклонена. Это стандартная практика для минимизации поверхности атаки.
Некоторые программы, например демон FTP, могут выполнять дополнительную проверку: если оболочка пользователя отсутствует в /etc/shells, доступ запрещается даже при корректном пароле. Это предотвращает использование учётных записей с «нестандартными» оболочками для несанкционированного доступа.
¶Редактирование файла
Для добавления новой оболочки в список администратор может отредактировать файл в любом текстовом редакторе с правами root. После изменения не требуется перезапуск служб — файл читается при каждом обращении. Однако следует убедиться, что добавляемый путь действительно существует и является исполняемым, иначе утилиты могут работать некорректно.
Рекомендуется включать в файл только те оболочки, которые реально установлены в системе. Избыточные записи не наносят вреда, но могут вводить в заблуждение.
¶Источники
- man-страницы chsh, useradd, login.defs (Linux)
- Документация FreeBSD по файлу /etc/shells
- Руководство администратора macOS по управлению учётными записями
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →
