Открыть сервис

Файл /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 →