(Насколько мне известно, этот ответ может показаться излишне сложным, но его легко расширять и использовать в отношении пробелов и специальных символов.)
Вы можете передавать данные прямо через стандартввод команды ssh
и read
из удаленного местоположения.
В следующем примере
- индексированный массив заполняется (для удобства) именамипеременные, значения которых вы хотите получить на удаленной стороне.
- Для каждой из этих переменных мы даем
ssh
строку с нулевым символом в конце, дающую имя и значение переменной. - В самой команде
shh
мы перебираем эти строки для инициализации необходимых переменных.
# Initialize examples of variables.
# The first one even contains whitespace and a newline.
readonly FOO=$'apjlljs ailsi \n ajlls\t éjij'
readonly BAR=ygnàgyààynygbjrbjrb
# Make a list of what you want to pass through SSH.
# (The “unset” is just in case someone exported
# an associative array with this name.)
unset -v VAR_NAMES
readonly VAR_NAMES=(
FOO
BAR
)
for name in "${VAR_NAMES[@]}"
do
printf '%s %s\0' "$name" "${!name}"
done | ssh user@somehost.com '
while read -rd '"''"' name value
do
export "$name"="$value"
done
# Check
printf "FOO = [%q]; BAR = [%q]\n" "$FOO" "$BAR"
'
Вывод:
FOO = [$'apjlljs ailsi \n ajlls\t éjij']; BAR = [ygnàgyààynygbjrbjrb]
Если вам не нужноexport
тех, вы должны иметь возможность использовать declare
вместо export
.
A действительно упрощенную версию (если вам не нужна расширяемость, используйте одну переменнуюобрабатывать и т. д.)ке:
$ ssh user@somehost.com 'read foo' <<< "$foo"