#Когда возникает ошибка в Debian и какие условия важны
При подключении по SSH к Debian переменная может существовать в локальном терминале, но отсутствовать в удалённом сеансе, либо присутствовать при интерактивном входе и пропадать при запуске удалённой команды. Важны раздельные правила OpenSSH, PAM и оболочки.
#Причины и как отличить их друг от друга
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Переменная не передаётся SSH | На клиенте значение есть, на сервере printenv пуст. | Сверить разрешённые SendEnv и AcceptEnv. |
| Настройки оболочки читаются не всегда | Локальный интерактивный bash загружает другой набор файлов. | Различить интерактивную, login и неинтерактивную оболочку. |
| Значение теряется после sudo | До смены прав значение доступно, после sudo — нет. | Проверить secure_path и env_reset без глобального ослабления защиты. |
#Пошаговая диагностика и устранение
- 1. Сначала определите, где именно пропадает значениеВ клиентском терминале выполните printenv для безопасной переменной, например LANG. После SSH-подключения повторите эту команду в Debian. Не подставляйте имена переменных с паролями, токенами или ключами; не отправляйте их в журнал или в сообщение об ошибке.
- Чтение данных и диагностикаLinux · Терминал (Bash)КомандаЧтение данных и диагностика. Изменений нет.
printf "локальное значение: %s\n" "${LANG-не задано}"printenv LANG
- 2. Сравните интерактивный вход и единичную удалённую командуОткройте отдельную вкладку терминала на клиенте и выполните ssh ИМЯ@СЕРВЕР printenv LANG. В обычном сеансе ssh ИМЯ@СЕРВЕР затем выполните ту же команду. Различающийся вывод говорит о контексте запуска оболочки, но ещё не доказывает ошибку SSH.
- Чтение данных и диагностикаLinux · Терминал (Bash)КомандаЧтение данных и диагностика. Изменений нет.
ssh ИМЯ@СЕРВЕР printenv LANG
- 3. Посмотрите активные параметры SSH со стороны клиентаВыполните ssh -G, указав реального получателя, и найдите поля sendenv. На сервере команды sshd -T обычно выполняет администратор; через неё выясните acceptenv и setenv. Значение AcceptEnv из конфигурации — разрешение, но не гарантия, что клиент отправил переменную.
- ssh -G запускается на клиенте, sshd -T — на сервере от администратораLinux · Терминал (Bash)КомандаНужен sudossh -G запускается на клиенте, sshd -T — на сервере от администратора.
ssh -G ИМЯ@СЕРВЕР | grep -i "^sendenv"sudo sshd -T | grep -E "^(acceptenv|setenv)"
- 4. Проверьте файлы профиля конкретного пользователяНа сервере выясните домашний каталог и применяемую оболочку. Для bash файлы ~/.bash_profile, ~/.profile и ~/.bashrc читаются в разных условиях; shell-скрипты cron и systemd не обязаны читать их совсем. Не помещайте пароли в /etc/environment ради удобства.
- Чтение данных и диагностикаLinux · Терминал (Bash)КомандаЧтение данных и диагностика. Изменений нет.
getent passwd "$(id -un)"printf "%s\n" "$SHELL"ls -la "$HOME/.profile" "$HOME/.bashrc" 2>/dev/null
- 5. При необходимости настройте безопасную передачу одного имениЕсли нужно переносить именно несекретную переменную, согласуйте с администратором SendEnv на клиенте и AcceptEnv на сервере только для этого имени. Прежде чем менять sshd_config, сделайте резервную копию и проверьте синтаксис командой sshd -t; не закрывайте текущую SSH-сессию до успешного входа во второй вкладке.
- Команды на сервере; тест только проверяет конфигурациюLinux · Терминал (Bash)С осторожностьюНужен sudoКоманды на сервере; тест только проверяет конфигурацию.
sudo cp -a /etc/ssh/sshd_config /etc/ssh/sshd_config.backup-whelpsudo sshd -tКоманда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
- 6. Проверьте, не вмешивается ли sudoСравните вывод printenv LANG обычного пользователя и команды через sudo. При настройке sudoers используйте visudo, не удаляйте env_reset массово: ограничения предотвращают подмену исполняемых команд и библиотек. Если проблема только после sudo, исправляйте разрешение строго для нужной задачи.Linux · Терминал (Bash)КомандаНужен sudosudo потребуется только для второго сравнения.
printenv LANGsudo printenv LANG
- 7. Подтвердите на новом подключенииОткройте новый SSH-сеанс, а прежний оставьте открытым на случай ошибки конфигурации. Сверьте значение в интерактивной и неинтерактивной командах, затем проверьте приложение, которому оно требуется. Если переменная вновь исчезает, запишите тип оболочки и итоговые SendEnv/AcceptEnv.
- Чтение данных и диагностикаLinux · Терминал (Bash)КомандаЧтение данных и диагностика. Изменений нет.
ssh ИМЯ@СЕРВЕР printenv LANG
#Проверка результата и действия при неуспехе
Успешная настройка обеспечивает передачу только действительно необходимой несекретной переменной в правильный тип SSH-сеанса; безопасность и вход на сервер сохраняются.