Я запускаю сценарии на удаленном сервере с локального сервера через SSH.Сценарий сначала копируется с использованием SCP, а затем вызывается при передаче следующих аргументов:
scp /path/to/script server.example.org:/another/path/
ssh server.example.org \
MYVAR1=1 \
MYVAR2=2 \
/another/path/script
Это прекрасно работает, и на удаленном сервере переменные MYVAR1
и MYVAR2
доступны с соответствующим значением.
Проблема заключается в том, что эти сценарии находятся в постоянном развитии, что требует изменения команды SSH при каждом переименовании, добавлении или удалении переменной.
Iищу способ передачи всех локальных переменных среды в удаленный сценарий (поскольку MYVAR1
и MYVAR2
на самом деле являются локальными переменными среды), которые могли бы решить проблему обслуживания команды SSH.
, начиная с MYVAR1=1 \
и MYVAR1=1 \
- строки, которые следуют за выводом команды env
. Я попытался заменить их действительной командой следующим образом:
ssh server.example.org \
`env`
/another/path/script
Это похоже на "простые" env
строки вывода (например,SHELL=/bin/bash
или LOGNAME=sysadmin
), однако я получаю ошибки для более «сложных» выходных строк (например, LS_COLORS=rs=0:di=01;34:ln=01;[...]
, который дает ошибки, такие как -bash: 34:ln=01: command not found
).Я могу избавиться от этих ошибок, сбросив переменные, соответствующие этим сложным выходным строкам, перед запуском команды SSH (например, unset LS_COLORS
, затем ssh [...]
), однако я не считаю это решение очень надежным.
В: Кто-нибудь знает, как передать все локальные переменные среды в удаленный скрипт через SSH?
PS: локальные переменные среды не являются переменными среды, доступными на удаленной машине поэтому я не могу использовать это решение .
Обновление с решением
Я прекратил использовать sed
для форматирования вывода команды env
из VAR=VALUE
в VAR="VALUE"
(и объединение всех строк в 1), что не позволяет bash интерпретировать некоторые выходные данные как команды и исправляет мою проблему.
ssh server.example.org \
`env | sed 's/\([^=]*\)=\(.*\)/\1="\2"/' | tr '\n' ' '` \
"/another/path/script"