Мне необходимо скачивать файлы с remote Linux device (удалённая машина), а именно с некой папки, путь к которой хранится в некой environment variable на этой самой удалённой машине. Разумеется, на каждой удалённо машине своё значение переменной. Пусть для примера сама переменная называется RemoteVar, и на одной машине её значением является /home/yocto/folder1/ а на другой /home/buildroot/folder2/
Хочется сделать как обычно
a@host:~$ rsync -rvz ruser@192.168.0.111:/home/yocto/folder1/ $HOME/hostStorage/
Но это подойдёт только для первой удалённой машины. В голову приходит (неверная) идея попробовать
a@host:~$ rsync -rvz ruser@192.168.0.111:$HOME/folder1/ $HOME/hostStorage/
Но нет, $HOME - это переменная из мира host, поэтому такой вариант не подходит. Тем более что даже если бы сработало (одинаковые имена пользователей), ошибка была бы дальше, ведь на одной удаленной машине folder1/ а на другой folder2/.
Я держу в голове, что на каждой удалённой машине есть корректная переменная окружения. Она называется RemoteVar. (Как она там появилась - отдельный вопрос, например, появилась в ходе запуска какого-то скрипта или вручную прописана). На первой машине
a@rem1:~$ echo $RemoteVar
/home/yocto/folder1/
А на другой /home/buildroot/folder2/ Но как же обратиться к переменной окружения, которая находится на 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.
Теперь я могу сформулировать рабочее решение
a@host:~$ RemoteVarOnHost=$(ssh remoter@192.168.0.111 'source /etc/profile.d/MyEnvList.sh; echo $RemoteVar')
a@host:~$ echo $RemoteVarOnHost
/home/yocto/folder1/
Или вот такое же решение для тех кто использует key-based авторизацию (и правильно делает)
a@host:~$ RemoteVarOnHost=$(ssh remoter@192.168.0.111 -i "ssh_key" 'source /etc/profile.d/MyEnvList.sh; echo $RemoteVar')
host@linux:~$ echo $RemoteVarOnHost
/home/yocto/folder1/
В результате вот так можно скачать файлы с удаленной машины по пути, прочитанному из environment variable на этой самой удаленной машине
rsync -rvz ruser@192.168.0.111:$RemoteVarOnHost $HOME/hostStorage/