Мне необходимо скачивать файлы с remote Linux device (удалённая машина), а именно с некой папки, путь к которой хранится в некой environment variable на удалённой машине. Разумеется, на каждой удалённой машине своё значение переменной. Пусть для примера сама переменная называется RemoteVar, и на одной удалённой машине её значением является '/home/yocto/folder 1/' а на другой '/home/buildroot/folder 2/'
Хочется сделать как обычно
a@host:~$ rsync -rvz "ruser@192.168.0.111:/home/yocto/folder 1/" "$HOME/hostStorage/"
Но это подойдёт только для первой удалённой машины. В голову приходит (неверная) идея попробовать
a@host:~$ rsync -rvz "ruser@192.168.0.111:$HOME/folder 1/" "$HOME/hostStorage/"
Но нет, "$HOME" - это переменная из мира host, поэтому такой вариант не подходит. Тем более что даже если бы сработало (одинаковые имена пользователей), ошибка была бы дальше, ведь на одной удаленной машине 'folder 1/' а на другой 'folder 2/'.
Я держу в голове, что на каждой удалённой машине есть корректная переменная окружения. Она называется RemoteVar. (Как она там появилась - отдельный вопрос, например, появилась в ходе запуска какого-то скрипта или вручную прописана). На первой машине
a@rem1:~$ echo "$RemoteVar"
/home/yocto/folder 1/
А на другой /home/buildroot/folder 2/
Но как же обратиться к переменной окружения, которая находится на remote device с помощью скрипта, исполняющегося на host device?
Я наткнулся на сообщение и возникла идея: с помощью утилиты ssh запустить на remote device скрипт. Этот скрипт вернёт текущее значение переменной окружения. Останется это значение сохранить в другую переменную, уже на host device.
a@host:~$ RemoteVarOnHost="$(ssh remoter@192.168.0.111 'echo $RemoteVar')"
a@host:~$ echo "$RemoteVarOnHost"
И увы это не сработало (возвращает пустоту)... Но это сработало бы для переменных оболочки, например, так сработает
a@host:~$ RemoteVarOnHost="$(ssh remoter@192.168.0.111 'echo $HOME')"
a@host:~$ echo "$RemoteVarOnHost"
/home/yocto/
Далее я подумал о том, что могу воспользоваться функцией source, которая загружает переменные и функции из файла и оставляет их доступными после себя. Тогда source /etc/profile.d/MyEnvList.sh
запущенный на удаленно машине, загрузит необходимую мне переменную"$RemoteVar"
А код echo $RemoteVar выведет текущее значение переменной. Осталось его сохранить уже в переменную "$RemoteVarOnHost", расположенную на стороне host.
Теперь я могу сформулировать рабочее решение. Шаг 1) - получение environment variable на стороне хоста. Вот так - для любителей вводить вручную пароли (не подходит для скриптов)
a@host:~$ RemoteVarOnHost="$(ssh remoter@192.168.0.111 'source /etc/profile.d/MyEnvList.sh; echo $RemoteVar')"
a@host:~$ echo "$RemoteVarOnHost"
/home/yocto/folder 1/
Или вот шаг 1) так для тех, кто использует key-based авторизацию (и любит писать скрипты). Вместо ssh_key подставьте путь к вашему ключу...
a@host:~$ RemoteVarOnHost="$(ssh remoter@192.168.0.111 -i "ssh_key" 'source /etc/profile.d/MyEnvList.sh; echo $RemoteVar')"
a@host:~$ echo "$RemoteVarOnHost"
/home/yocto/folder 1/
Шаг 2). Вот так можно скачать файлы с удаленной машины по пути, прочитанному из environment variable на этой самой удаленной машине
rsync -rvz "ruser@192.168.0.111:$RemoteVarOnHost" "$HOME/hostStorage/"
Или вот шаг 2) так для тех, кто использует key-based авторизацию
rsync -rvz -e "ssh -i 'ssh_key" "ruser@192.168.0.111:HOME/hostStorage/"
Или вот оба шага вместе для тех, у кого (чать) пути к ssh_key выведена в свою environment variable. Я также добавил сюда опцию StrictHostKeyChecking=no чтобы "automatically add new host keys to the user known hosts" - это полезно, когда вы постоянно пересоздаёте сервер. Опция BatchMode=yes заставит ssh сообщить об ошибке вместо перехода к запросу пароля у юзера (если вы пишите скрипт, то вероятно вместо запроса пароля ваш скрипт зависнет, и вы будете гадать почему).
options=(-rvz -e "ssh -i $MyBaseDir/my_ssh_key -o StrictHostKeyChecking=no -o BatchMode=yes" --progress) && rsync "${options[@]}" "ruser@192.168.0.111:$RemoteVarOnHost" "$HOME/hostStorage/"
Комментарии (3)

baldr
22.10.2025 16:22ssh myserver 'echo $HOME'Команда выведет значение $HOME на удалённом сервере.
Используйте не двойные, а одинарные кавычки. Так переменная не будет раскрываться в текущей сессии.

AlexDexsoon
22.10.2025 16:22Напишите Ansible плейбук, там можно и части кода на localhost стартовать, и явно все в переменные заносить. И никакой bash магии, которая сильно зависит от дистрибутива.
shuchkin
rsyncd + хосты бэкапят себя сами