Разбор Linux на собеседовании: диагностика и опасные команды
Автор: Казачкин Даниил Михайлович · Обновлено
На техническом собеседовании полезно не угадывать «нужную команду», а выстроить проверяемое объяснение. Хороший ответ разделяет наблюдение, возможные причины, следующий…
На техническом собеседовании полезно не угадывать «нужную команду», а выстроить проверяемое объяснение. Хороший ответ разделяет наблюдение, возможные причины, следующий безопасный замер и критерий исправления. Ниже — задачи для администратора и DevOps-инженера с разбором механизма, а не заученными списками.
Что происходит после Enter
Shell разбирает строку: кавычки, подстановки, перенаправления и конвейеры. Затем определяет, встроенная это команда, функция или внешний файл; PATH участвует в поиске внешней команды. Для внешней программы shell обычно создаёт процесс и запускает execve; сам execve заменяет образ вызывающего процесса. Ядро проверяет доступ, формат исполняемого файла и при необходимости интерпретатор shebang. Поэтому cd должен менять рабочий каталог самого shell, а sudo cd не переносит текущий терминал в новый каталог.
У процесса собственное адресное пространство и набор ресурсов, а потоки одного процесса разделяют память и многие ресурсы, но имеют отдельное состояние исполнения и могут планироваться независимо. Из этого следует: изменение общей переменной требует синхронизации потоков, а падение процесса может затронуть все его потоки. Назвать thread «облегчённым процессом» без уточнения разделяемых ресурсов — неполный ответ.
Сигнал отправлен, процесс остался
SIGTERM допускает обработчик и даёт программе возможность завершить работу. SIGKILL нельзя обработать или заблокировать, однако процесс в непрерываемом ожидании D может не исчезнуть немедленно: нужно завершение соответствующего ожидания ядра. Zombie уже не исполняется; запись сохраняет результат для родителя, и повторный kill не заменяет wait родителя. Проверьте ps -o pid,ppid,stat,wchan:24,comm -p PID, а не посылайте SIGKILL всем похожим именам.
Пример ответа: «Команда kill вернула успех — сигнал удалось направить. Проверю состояние, родителя и причину ожидания. Если D связано с ошибками диска, исследую журнал и устройство». Это точнее обещания, что девятый сигнал немедленно устраняет любую проблему. Модель сигналов.
Пользователь, пароль и привилегия
/etc/passwd хранит имя, UID/GID, домашний каталог и shell; современная локальная схема обычно хранит хэш пароля и сроки в защищённом /etc/shadow. Значок x в passwd не является самим паролем. Блокировка пароля не обязательно запрещает вход по SSH-ключу: способ аутентификации проверяют отдельно.
SUID у исполняемого файла может изменить effective UID при запуске, поэтому важны владелец, возможность записи файла, filesystem nosuid и ограничения запуска. SUID root на универсальном интерпретаторе создаёт гораздо более широкую возможность, чем одна разрешённая операция. Capabilities дробят привилегии, но ошибочно выданная capability тоже опасна. Объясняйте требуемую операцию прежде, чем выбирать sudo, SUID или setcap.
Четыре цепочки диагностики
| Наблюдение | Первый полезный замер | Как различить причины |
|---|---|---|
| ENOSPC при небольшом файле | df -h и df -i для нужного пути | Блоки, inode, квота, удалённый открытый файл |
| По IP доступно, по имени нет | getent ahosts и DNS-запрос | NSS/hosts, DNS, ошибочный адрес, отдельная проблема приложения |
| Служба failed | systemctl status/show и журнал того же запуска | ExecStart, пользователь, конфигурация, порт, рестарты |
| Permission denied при «правильных» правах | namei -l, findmnt, id и журнал политики | Каталог без x, ACL, noexec, SELinux/AppArmor |
Заполненный диск не лечат удалением случайного большого файла до выяснения его владельца. Если после unlink место не освободилось, проверьте удалённые открытые файлы через lsof +L1. Для замедления сервера начните с временного интервала и USE/PSI из [урока 46](/lessons/without-university/linux-developer-foundations/linux-developer-46). Для systemd соберите связный маршрут из [урока 25](/lessons/without-university/linux-developer-foundations/linux-developer-25).
./script.sh на noexec-mount может завершиться EACCES; чтение того же файла через интерпретатор иногда разрешено. Это помогает понять слой запрета, но не даёт права обходить принятую политику. Отсутствующий интерпретатор shebang способен выглядеть как «файл не найден», хотя сам script существует. Ошибки execve.
Команда опасна своей областью действия
rm -r обходит дерево, -f подавляет часть запросов и ошибок отсутствия. Ни один из флагов не проверяет, что переменная означает нужный проект. Особо опасен путь, построенный из пустой переменной. Перед удалением требуется проверка принадлежности каталогу и предварительный список. На собственном учебном дереве достаточно показать план:
safe_lab=$(mktemp -d)
mkdir "$safe_lab/cache"
cache_path=$(realpath -e -- "$safe_lab/cache")
case "$cache_path" in
"$safe_lab"/*) find "$cache_path" -mindepth 1 -maxdepth 1 -print ;;
*) printf 'Unexpected path\n' >&2; exit 2 ;;
esacКавычки сохраняют один аргумент, но не доказывают правильность его значения. Проверка и использование пути тоже могут разделяться гонкой в каталоге, доступном посторонним; для автоматического удаления нужны контролируемые владельцы и структура.
У dd ошибка of= меняет устройство назначения, а mkfs создаёт новую файловую систему поверх прежних структур. Сначала нужны модель, serial, размер, сигнатуры и отсутствие mount; название sdb не постоянно. Экспериментируйте только с одноразовой VM или файлом-образом. chmod -R 777 даёт посторонним запись и исполнение, но не устраняет неправильного владельца, noexec или MAC-политику.
Неконтролируемое порождение процессов сдерживают TasksMax/pids.max и пользовательские лимиты; демонстрировать fork bomb на рабочем хосте не требуется. У curl ... | bash исполнение начинается без самостоятельного осмотра полного артефакта. Разделите загрузку, проверку доверенного источника/подписи и запуск с минимальными правами; один HTTPS не подтверждает безопасность программы.
Финальная задача: выберите любую строку таблицы и дайте двухминутный ответ с двумя гипотезами, одним различающим замером и планом отката. Успех — наблюдаемое восстановление нужной операции, а не исчезновение сообщения после случайного перезапуска.