#Когда возникает проблема и к каким системам относится
Команда по SSH не получает переменную, которая есть при локальном входе. Не все SSH-сессии запускают интерактивную или login-оболочку; настройки клиента и сервера могут ограничивать приём переменных. Rocky Linux с OpenSSH; речь о переменных окружения пользовательской оболочки при подключении по SSH, а не о передаче секретов.
#Основные причины: как отличить одну от другой
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Разный режим оболочкиssh host команда выполняется без интерактивного профиля | echo в интерактивной сессии отличается от ssh host env | Разместить конфигурацию в подходящем для режима месте |
| Ограничена пересылка переменныхSendEnv на клиенте не соответствует AcceptEnv на сервере | При подключении переменная не появляется в env | Проверить ssh_config и sshd_config с правами |
| Переменная задаётся не тому пользователюsudo или система служб отбрасывают окружение | whoami и env отличаются | Настраивать среду на уровне конкретного процесса |
#Пошаговая диагностика и устранение неисправности
- Шаг 1. Сравните окружение в двух режимах SSHПодключитесь как обычно, затем выполните однострочную команду с клиентского компьютера, подставив свой адрес. В примере нет паролей. Различие подтверждает, что проблема зависит от способа запуска оболочки.
- Терминал Rocky Linux; административные права не обязательныLinux · Терминал (Bash)КомандаТерминал Rocky Linux; административные права не обязательны. Диагностика или адресная проверка; выполните только при соответствии условиям шага.
ssh user@server.example 'printf "shell=%s variable=%s\n" "$SHELL" "${LANG-НЕ_ЗАДАНА}"'
- Шаг 2. Установите оболочку и тип запускаНа сервере проверьте /etc/passwd через getent и системный режим оболочки. В Bash файлы ~/.bash_profile и ~/.bashrc обрабатываются по-разному, а команды ssh host cmd обычно выполняются в неинтерактивной среде.Linux · Терминал (Bash)КомандаТерминал Rocky Linux; административные права не обязательны. Диагностика или адресная проверка; выполните только при соответствии условиям шага.
getent passwd "$USER"printf "flags=%s\n" "$-"shopt login_shell || true
- Шаг 3. Проверьте, где назначается переменнаяСначала выясните, где определено требуемое значение. Не вставляйте секретные ключи в ~/.bashrc или /etc/profile. Для системной службы настройте переменную в unit или через подходящее хранилище учётных данных, а не в оболочке SSH.
- Терминал Rocky Linux; административные права не обязательныLinux · Терминал (Bash)КомандаТерминал Rocky Linux; административные права не обязательны. Диагностика или адресная проверка; выполните только при соответствии условиям шага.
grep -nE "(^|[[:space:]])(export )?[A-Za-z_][A-Za-z0-9_]*=" ~/.bash_profile ~/.profile ~/.bashrc 2>/dev/null | head -35
- Шаг 4. Проверьте правила передачи среды по SSHНа клиенте ssh -G печатает эффективную конфигурацию SendEnv. На сервере администратор может прочитать AcceptEnv в конфигурации демона; сервер разрешает только конкретные имена, а произвольные значения с клиента небезопасны.
- Терминал Rocky Linux; нужны административные праваLinux · Терминал (Bash)КомандаНужен sudoТерминал Rocky Linux; нужны административные права. Диагностика или адресная проверка; выполните только при соответствии условиям шага.
ssh -G server.example | grep -iE "^sendenv|^setenv"sudo sshd -T | grep -i "^acceptenv"
- Шаг 5. Если нужна переменная лишь одной команде — задайте её адресноДля несекретного параметра при проверке передайте значение прямо в удалённую команду. Убедитесь, что оно не попадает в историю и журналы, если чувствительно. Пример запускает только env и печатает один проверочный ключ.
- Терминал Rocky Linux; административные права не обязательныLinux · Терминал (Bash)КомандаТерминал Rocky Linux; административные права не обязательны. Диагностика или адресная проверка; выполните только при соответствии условиям шага.
ssh user@server.example "MY_TEST_FLAG=ok env | grep ^MY_TEST_FLAG="
- Шаг 6. Проверьте работу с sudo отдельноПри переключении пользователя sudo обычно очищает часть среды; это ожидаемое поведение. Для приложения не включайте глобально env_keep для всех переменных, особенно связанных с загрузкой библиотек.
- Терминал Rocky Linux; нужны административные праваLinux · Терминал (Bash)КомандаНужен sudoТерминал Rocky Linux; нужны административные права. Диагностика или адресная проверка; выполните только при соответствии условиям шага.
env | grep -E "^(PATH|LANG|HOME)="sudo env | grep -E "^(PATH|LANG|HOME)="
- Шаг 7. Проверьте после повторного входа и зафиксируйте способОткройте новое SSH-подключение, повторите именно первоначальную команду (интерактивную либо удалённую). Если значение требуется процессу systemd, проверяйте окружение самой службы; shell-переменная родителя туда автоматически не переносится.
- Терминал Rocky Linux; административные права не обязательныLinux · Терминал (Bash)КомандаТерминал Rocky Linux; административные права не обязательны. Диагностика или адресная проверка; выполните только при соответствии условиям шага.
ssh user@server.example 'printf "LANG=%s\n" "${LANG-}"'
#Как убедиться, что неисправность устранена
Переменная видна в нужном режиме SSH и в нужном процессе после нового входа; при этом не разрешена бесконтрольная пересылка переменных или секретов.
#Если предложенный способ не сработал
Если работает только интерактивная оболочка, пересмотрите расположение экспорта и способ запуска приложения; приложите к разбору ssh -G, режим оболочки и перечень имён переменных без значений секретов.