#Что означает проблема и кому подходит инструкция
Переменная окружения видна в локальном терминале Ubuntu, но отсутствует при подключении по SSH или запуске команды ssh host команда. Это часто нормальное различие между интерактивным, входным и невходным сеансами, а не ошибка OpenSSH.
#Возможные причины и отличительные признаки
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Файл инициализации оболочки не читаетсяПеременная определена в ~/.bashrc, а удалённая команда запускается без интерактивной оболочки. | Входной терминал видит переменную, однократный запуск ssh — нет. | Определить, где переменная нужна, и задать её в соответствующем месте. |
| Переменная не экспортированаПрисваивание NAME=value в оболочке не передаёт значение дочерним процессам. | В set есть имя, а env его не показывает. | Экспортировать безопасное значение в нужном окружении. |
| sshd не принимает пересылаемую переменнуюAcceptEnv на сервере ограничивает разрешённые имена, SendEnv — на клиенте. | Локально имя есть, но сервер его не получает. | Настроить согласованную пересылку, не передавать секреты. |
#Диагностика и пошаговое устранение
- 1. Сравните интерактивный вход и удалённую командуОткройте Терминал Ubuntu на клиенте. Подключитесь
ssh пользователь@сервер, затем на сервере выполнитеprintfиenv. Повторите проверку отдельной командойssh пользователь@сервер "printenv ИМЯ". В обоих случаях подставьте реальные адрес и название переменной; вывод для секрета не публикуйте и не печатайте без необходимости. Различия покажут, в какой сеанс не попало значение. - Для первой проверки выполняется на сервере после SSH-входа; не выводите токеныLinux · Терминал (Bash)КомандаДля первой проверки выполняется на сервере после SSH-входа; не выводите токены.
printf "%s\n" "$SHELL"printenv ИМЯ_ПЕРЕМЕННОЙ
- 2. Определите оболочку и режим её запускаВ SSH-сеансе посмотрите
echo "$0",echo "$SHELL"иps -p $$ -o args=. Bash может читать ~/.bash_profile или ~/.profile при входе и ~/.bashrc в интерактивном невходном сеансе; поведение удалённого запуска зависит от оболочки и конфигурации. Не предполагаете, что ~/.bashrc всегда читается. - Просмотрить файл конфигурации выбранной оболочки до измененийLinux · Терминал (Bash)КомандаПросмотрить файл конфигурации выбранной оболочки до изменений.
printf "shell=%s, argv0=%s\n" "$SHELL" "$0"ps -p $$ -o args=
- 3. Проверьте экспорт переменнойВ той оболочке, где значение уже задано, команда
printenv ИМЯ_ПЕРЕМЕННОЙпокажет только экспортированные значения. Если пусто, аecho "$ИМЯ_ПЕРЕМЕННОЙ"не пусто, проверьте, как выполняется присваивание. Для несекретного значения можно в тестовом сеансе выполнитьexport ИМЯ_ПЕРЕМЕННОЙ=тест, запуститьenvи убедиться, что дочерние процессы его видят. Настройка действует до выхода из оболочки.Linux · Терминал (Bash)КомандаЗаменить имя; не передавать пароли через переменные окружения без оценки рисков.printenv ИМЯ_ПЕРЕМЕННОЙenv | grep "^ИМЯ_ПЕРЕМЕННОЙ="
- 4. Выберите место для постоянного определенияДля личной интерактивной работы отредактируйте конфигурацию используемой оболочки и добавьте
export ИМЯ=значениетолько для несекретного параметра; перед правкой сделайте копию файла. Для systemd-службы используйте еёEnvironment=/EnvironmentFile=или механизмы Credentials — ~/.bashrc её не настроит. Для разовой удалённой команды более надёжно явно передавать допустимое значение в той же команде, если оно не секретное. - Изменение файлов не выполняется автоматическиLinux · Терминал (Bash)КомандаИзменение файлов не выполняется автоматически. Исключите секреты из истории команд.
ls -la ~/.profile ~/.bash_profile ~/.bashrc 2>/dev/nullprintenv SHELL
- 5. Если нужна передача с клиента, проверьте правила SSHНа клиенте конфигурация
SendEnvопределяет, что разрешено отправлять; на сервереAcceptEnv— что будет принято. Администратор сервера может посмотреть итоговые параметры черезsudo sshd -Tи настроить минимальный список в /etc/ssh/sshd_config или отдельном файле в sshd_config.d. Перед перезапуском sshd обязательнаsudo sshd -t, запасное соединение оставьте открытым. Не разрешайтеAcceptEnv *.Linux · Терминал (Bash)КомандаНужен sudoТолько на сервере под администратором; команды не изменяют настройки.sudo sshd -tsudo sshd -T | grep -i acceptenv
- 6. Проверьте новый сеанс, а не существующийЗавершите тестовое SSH-соединение командой exit; подключитесь снова и выполните
printenv ИМЯ, а затем удалённую команду (если она важна). Если переменная доступна только в одной форме входа, это ожидаемое отличие режимов — настройте конкретный способ запуска, вместо глобальной модификации всех пользователей.Linux · Терминал (Bash)КомандаЗапуск в новом SSH-сеансе подтверждает, что изменение действительно постоянное.printenv ИМЯ_ПЕРЕМЕННОЙ
#Как убедиться, что неисправность устранена
Решение считается рабочим, когда несекретная переменная доступна ровно тому процессу и режиму SSH, которому предназначалась. Если проблема относится к systemd или cron, настройка SSH сама по себе её не исправит.
#Если результат не получен
Не повторяйте опасные действия наугад. Сохраните точную формулировку ошибки, вывод диагностики без секретов, версию Ubuntu и данные о затронутом компоненте. Верните лишь собственные изменения из резервной копии; если затронута загрузка, диски или рабочий сервер, воспользуйтесь консолью восстановления либо помощью администратора.