Гайд: Решение ошибки «Отказано в доступе» при записи в /etc/environment в Astra Linux - Часть 3
10. Ограничения sudo
Иногда пользователю разрешён sudo, но только для ограниченного набора команд.
Проверьте:
sudo -l
Если там нет права на tee, nano, vi, sed, edit, sudoedit и похожие команды, запись может не сработать.
Пример безопасного запроса к администратору:
Прошу разрешить пользователю имя_пользователя выполнение команды /usr/bin/tee -a /etc/environment через sudo для настройки системных переменных окружения. Но в производственных системах лучше не давать прямой доступ к /etc/environment, а использовать конфигурационное управление.
11. Если вы работаете в контейнере, chroot или overlay
Если система работает в контейнере, chroot или использует overlay-файловую систему, /etc/environment может быть доступен только для чтения.
Проверьте:
systemd-detect-virt
Если вывод показывает контейнерную среду, например:
docker
lxc
podman
то файл может принадлежать образу контейнера.
Проверить cgroup:
cat /proc/1/cgroup
Проверить монтирование корня:
findmnt /
Если корень — overlay, изменения могут не сохраняться или блокироваться.
В этом случае:
- редактируйте исходный образ контейнера;
- используйте Dockerfile, volume или config map;
- не пытайтесь изменить файл внутри временного слоя, если это запрещено.
12. Безопасное редактирование /etc/environment
12.1. Через sudoedit
sudoedit /etc/environment
Это самый аккуратный способ, если он разрешён.
После сохранения проверьте содержимое:
cat /etc/environment
12.2. Через tee
Добавить строку:
echo "MY_VAR=value" | sudo tee -a /etc/environment > /dev/null
Или с кавычками:
printf 'MY_VAR="value"\n' | sudo tee -a /etc/environment > /dev/null
12.3. Перед изменениями сделайте резервную копию
sudo cp -a /etc/environment /etc/environment.bak-$(date +%Y-%m-%d_%H-%M-%S)
Проверка:
ls -l /etc/environment*
13. Правильный формат /etc/environment
Файл /etc/environment — это не shell-скрипт.
В нём обычно используются строки вида:
KEY=value
или:
KEY="value"
Пример:
LANG=ru_RU.UTF-8
LANGUAGE=ru_RU:ru
JAVA_HOME=/opt/jdk-17
http_proxy="http://proxy.example.local:3128"
https_proxy="http://proxy.example.local:3128"
Не надо писать:
export LANG=ru_RU.UTF-8
Это формат для файлов вроде /etc/profile, /etc/profile.d/*.sh, ~/.bashrc, а не для /etc/environment.
14. Как добавить переменную безопасно
Например, нужно добавить:
JAVA_HOME=/opt/jdk-17
Команда:
echo "JAVA_HOME=/opt/jdk-17" | sudo tee -a /etc/environment > /dev/null
Проверка:
grep JAVA_HOME /etc/environment
15. Как изменить уже существующую переменную
Лучше всего отредактировать вручную:
sudoedit /etc/environment
Найдите строку:
LANG=old_value
Замените на:
LANG=ru_RU.UTF-8
Если нужен автоматический вариант для простых случаев:
KEY="LANG"
VALUE="ru_RU.UTF-8"
sudo cp -a /etc/environment /etc/environment.bak-$(date +%Y-%m-%d_%H-%M-%S)
if sudo grep -Eq "^${KEY}=" /etc/environment; then
sudo sed -i "s|^${KEY}=.*|${KEY}=${VALUE}|" /etc/environment
else
printf '%s=%s\n' "$KEY" "$VALUE" | sudo tee -a /etc/environment > /dev/null
fi
Осторожно:
sed подходит только для простых значений без специальных символов. Для продакшена безопаснее использовать sudoedit или конфигурационное управление.
Информация предоставлена в ознакомительных целях. Применение описанных настроек в системах, должно осуществляться только после согласования с ответственными за информационную безопасность и в соответствии с требованиями ФСТЭК, ФСБ и иных уполномоченных органов.