#Симптом и границы применимости
При подключении к Arch Linux по SSH не появляется ожидаемая переменная окружения (например, для программы или пользовательского пути). Клиентская и серверная стороны, интерактивная оболочка и однократная удалённая команда используют разные способы передачи окружения.
#Возможные причины и признаки
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Переменная задаётся только в интерактивной оболочкеФайл ~/.bashrc может не исполняться при удалённой команде. | После обычного входа переменная есть, в ssh host env отсутствует. | Установить значение там, где оно действительно требуется. |
| Политика SSH не разрешает передачуOpenSSH передаёт лишь разрешённые сервером переменные. | SendEnv задан на клиенте, но AcceptEnv отсутствует на сервере. | Изменить список только конкретных безопасных имён. |
| Значение нужно службе, а не SSHsystemd и запущенные им службы не наследуют окружение интерактивной оболочки. | В SSH echo выводит значение, в systemctl show Environment его нет. | Настроить Environment=/EnvironmentFile= нужной службы. |
#Подробная диагностика и безопасные действия
- 1. Разделите сценарии SSHОткройте локальный терминал на своём ПК и выполните безопасный вывод имени пользователя и значения переменной на сервере. Замените USER@HOST и ПЕРЕМЕННАЯ на свои. Отсутствующее значение при однократной команде — не обязательно поломка OpenSSH.
- Диагностическая команда в терминале Arch Linux, без изменения настроекLinux · Терминал (Bash)КомандаДиагностическая команда в терминале Arch Linux, без изменения настроек.
ssh USER@HOST "id -un; printenv ПЕРЕМЕННАЯ"
- 2. Сравните интерактивный входЗайдите обычным
ssh USER@HOST, затем на сервере посмотрите окружение и название оболочки. Разницу между двумя режимами фиксируйте без публикации секретов; никогда не присылайте токены/пароли из printenv. - Диагностическая команда в терминале Arch Linux, без изменения настроекLinux · Терминал (Bash)КомандаДиагностическая команда в терминале Arch Linux, без изменения настроек.
ssh USER@HOSTprintf "%s\n" "$SHELL"printenv ПЕРЕМЕННАЯ
- 3. Определите, где задаётся переменнаяНа сервере проверьте личные файлы оболочки; Bash использует разные файлы для login и interactive. Если в переменной хранится секрет, не печатайте строку полностью. Если значения нет в файлах, оно может задаваться менеджером сеанса или приложения.
- Диагностическая команда в терминале Arch Linux, без изменения настроекLinux · Терминал (Bash)КомандаДиагностическая команда в терминале Arch Linux, без изменения настроек.
grep -n "ПЕРЕМЕННАЯ" ~/.bash_profile ~/.profile ~/.bashrc 2>/dev/nullloginctl show-user "$USER" -p Linger
- 4. Проверьте разрешённую передачу в конфигурацииДля передачи с клиента необходимы SendEnv (клиент) и AcceptEnv (сервер), но разрешать
*опасно. Прочитайте активную конфигурацию sshd на сервере; выводnoneлибо пустой список означает, что произвольное имя может быть отброшено. - Дополнительная команда по темеLinux · Терминал (Bash)КомандаНужен sudoВторую команду запускайте на сервере с административными правами; -T проверяет действующую конфигурацию.
ssh -G HOST | grep -i "^sendenv"sudo sshd -T | grep -i "^acceptenv"
- 5. Выберите безопасный способ заданияДля одной команды передавайте значение явно через механизм программы, не полагаясь на SendEnv. Для длительной настройки интерактивной Bash-сессии добавьте экспорт только не секретной переменной в соответствующий профиль пользователя и заново войдите. Для служб используйте unit, а не ~/.bashrc.
- Диагностическая команда в терминале Arch Linux, без изменения настроекLinux · Терминал (Bash)КомандаДиагностическая команда в терминале Arch Linux, без изменения настроек.
printf "Проверка: %s\n" "${ПЕРЕМЕННАЯ:-не задана}"systemctl --user show-environment | grep "^ПЕРЕМЕННАЯ="
- Дополнительная команда по темеLinux · Терминал (Bash)С осторожностьюНужен sudoТолько если конфигурация sshd действительно изменялась и проверка sshd -t прошла; есть риск потерять удалённый доступ.
sudo sshd -tsudo systemctl reload sshd.serviceКоманда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
- 6. Проверяйте изменения серверного SSH до перезагрузкиЕсли администратор вынужден изменить AcceptEnv для строго определённого имени, предварительно сохраните конфигурацию, выполните sshd -t и лишь затем reload на сервере, сохранив текущий сеанс открытым. Не меняйте настройки аутентификации ради одной переменной.
- 7. Проверьте обе формы подключенияОткройте второе SSH-подключение и выполните команду удалённо. Если оба режима работают, проблема устранена. Если значение доступно лишь в интерактивном сеансе, используйте профиль/login-shell или явный аргумент программы в зависимости от назначения.
- Диагностическая команда в терминале Arch Linux, без изменения настроекLinux · Терминал (Bash)КомандаДиагностическая команда в терминале Arch Linux, без изменения настроек.
ssh USER@HOST 'printenv ПЕРЕМЕННАЯ'ssh USER@HOST 'bash -lc "printenv ПЕРЕМЕННАЯ"'
#Как понять, что проблема устранена
Повторите исходное действие, из-за которого возникла неисправность, и сверяйте не только код завершения команды, но и прикладной результат. Сохраните вывод последней диагностической команды и записи журнала до и после исправления. Если ошибка повторяется, верните только изменённую настройку из резервной копии и передайте специалисту точный симптом, имя программы/службы, версию системы и необходимые фрагменты журнала без паролей и закрытых ключей.
#Что делать, если не помогло
Не применяйте случайные советы для другого дистрибутива: в Arch Linux особенно опасны частичные обновления пакетов, а в Rocky Linux — отключение SELinux или неконтролируемый перезапуск системных служб. Остановитесь после неуспешного безопасного шага, зафиксируйте фактическое сообщение и вернитесь к соответствующей причине. Для загрузки, разделов диска и единственного удалённого подключения используйте резервную копию и локальную консоль.