Профиль bash не загружается при запуске удаленного скрипта с помощью ssh

Ситуация:

Существует bash-скрипт под названием hello.sh на HOST-A. Этот скрипт использует некоторые переменные среды, доступные на HOST-A. Я выполняю этот скрипт из HOST-B.

Когда я запускаю hello.sh локально из HOST-A, он видит переменные среды. Но если я запускаю скрипт из HOST-B по ssh, скрипт не видит переменные окружения.

Среда:

  • HOST-A и HOST-B — это докер-контейнеры, основанные на alpine:3.17.3.
  • Порт 13012 — это порт докера HOST-A (13012:22)
  • Порт 13022 — это порт докера HOST-B (13022:22)

Тест, который работает как шарм:

  • Когда я вхожу в HOST-A с помощью docker exec -it HOST-A /bin/bash, скрипт видит переменные среды.
  • Когда я вхожу в HOST-A с помощью ssh -p 13012 root@localhost, скрипт видит переменные среды. Порт 13012 — это SSH-порт HOST-A, который Docker сопоставляет с хост-компьютером.
  • Когда я захожу в HOST-B, потом ssh HOST-A, потом запускаю скрипт, скрипт видит переменные окружения. Здесь я также тестирую ssh-соединение между хостами в Docker.

Проблема:

Профиль bash не устанавливается, когда я запускаю скрипт удаленно из HOST-B с помощью

[root@HOST-B]# sshpass -p "password" \
                  ssh -oStrictHostKeyChecking=no root@HOST-A 'bash -s < /hello.sh param'

Когда я пытаюсь запустить скрипт с хост-машины докера с помощью sshpass -p "password" ssh -p 13012 -oStrictHostKeyChecking=no "root@localhost" 'bash -s < /hello.sh param', он также не работает, профиль bash не установлен.

Предупреждение: param должна быть переменной: $param

Я думаю, что проблема в том, что профиль bash не установлен, когда я подключаюсь по ssh.

Что я пробовал, но не работал:

Я создал .bash_profile, .bashrc и .profile. У них точно такое же содержание:

# pwd
/root

# ls -all
-rw-r--r--    1 root     root            86 May 14 23:52 .bash_profile
-rw-r--r--    1 root     root            86 May 14 22:38 .bashrc
-rw-r--r--    1 root     root            86 May 14 22:52 .profile

Как правильно настроить профиль bash для удаленного выполнения ssh в alpine Linux?

☆☆☆ ОБНОВЛЕНИЕ ☆☆☆

Если я source.bashrc в hello.sh, то все работает нормально. Но это хак, выглядит очень плохо.

источник ~/.bashrc

bash rc-файлы предназначены для использования в интерактивных оболочках. source ~/.bashrc это правильный путь. это не взлом.

pynexj 15.05.2023 04:36

Я не согласен. Я думаю, что это hack / не очень хорошее решение. Например, если я добавлю нового пользователя, это решение не будет работать с этим новым пользователем. И я никогда не видел такого источника. Но, может быть, я ошибаюсь.

zappee 15.05.2023 09:07

Если вы хотите получить .bash_profile домашнего каталога удаленного хоста, вам необходимо создать оболочку входа в систему, то есть bash -l. См. раздел INVOCATION на справочной странице bash.

user1934428 15.05.2023 09:08

bash rc-файлы предназначены для использования в интерактивных оболочках — вот почему bash по умолчанию не загружает эти rc-файлы для неинтерактивных оболочек. для неинтерактивного использования я предлагаю вам поместить ваши общие файлы в определенный каталог и загрузить их явно.

pynexj 15.05.2023 09:38

некоторые функции bash доступны только для интерактивных оболочек. некоторые должны быть явно включены (например, поддержка псевдонимов), если вы хотите использовать их в сценариях. использование одних и тех же rc-файлов для интерактивных и неинтерактивных оболочек не совсем обычно.

pynexj 15.05.2023 09:47

@user1934428 user1934428 Если вы опубликуете это как решение, я соглашусь.

zappee 15.05.2023 10:31
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
6
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы .bash_profile обрабатывался, вам нужно указать опцию -l при вызове bash. Это делает bash оболочкой входа в систему. В этом случае обрабатываются и другие файлы входа в систему (как указано в разделе INVOCATION справочной страницы bash), например /etc/profile.

Спасибо за вашу помощь, наконец, я смог создать правильную команду: sshpass -p "$SSH_PASSWORD" ssh -oStrictHostKeyChecking=no "$SSH_USER@$HELLO_HOST" "bash -lc '/hello.sh $param'"

zappee 15.05.2023 11:43

Другие вопросы по теме