Ситуация:
Существует 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
Я не согласен. Я думаю, что это hack / не очень хорошее решение. Например, если я добавлю нового пользователя, это решение не будет работать с этим новым пользователем. И я никогда не видел такого источника. Но, может быть, я ошибаюсь.
Если вы хотите получить .bash_profile домашнего каталога удаленного хоста, вам необходимо создать оболочку входа в систему, то есть bash -l. См. раздел INVOCATION на справочной странице bash.
bash rc-файлы предназначены для использования в интерактивных оболочках — вот почему bash по умолчанию не загружает эти rc-файлы для неинтерактивных оболочек. для неинтерактивного использования я предлагаю вам поместить ваши общие файлы в определенный каталог и загрузить их явно.
некоторые функции bash доступны только для интерактивных оболочек. некоторые должны быть явно включены (например, поддержка псевдонимов), если вы хотите использовать их в сценариях. использование одних и тех же rc-файлов для интерактивных и неинтерактивных оболочек не совсем обычно.
@user1934428 user1934428 Если вы опубликуете это как решение, я соглашусь.





Чтобы .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'"
bash rc-файлы предназначены для использования в интерактивных оболочках.
source ~/.bashrcэто правильный путь. это не взлом.