Передача переменных в удаленной команде ssh
Я хочу иметь возможность запустить команду с моего компьютера с помощью ssh и пройти через переменную окружения $BUILD_NUMBER
Вот что я пытаюсь:
ssh [email protected] '~/tools/myScript.pl $BUILD_NUMBER'
$BUILD_NUMBER
устанавливается на машине, $BUILD_NUMBER
вызов ssh, и, поскольку переменная не существует на удаленном хосте, она не берется.
Как передать значение $BUILD_NUMBER
?
Ответы
Ответ 1
Если вы используете
ssh [email protected] "~/tools/run_pvt.pl $BUILD_NUMBER"
вместо
ssh [email protected] '~/tools/run_pvt.pl $BUILD_NUMBER'
ваша оболочка будет интерполировать $BUILD_NUMBER
перед отправкой командной строки на удаленный хост.
Ответ 2
Переменные в одиночных кавычках не оцениваются. Используйте двойные кавычки:
ssh [email protected] "~/tools/run_pvt.pl $BUILD_NUMBER"
Оболочка будет расширять переменные в двойных кавычках, но не в одиночных кавычках. Это будет изменено на желаемую строку перед передачей команде ssh
.
Ответ 3
Как уже было сказано, вам не нужно устанавливать переменную среды на удаленном хосте. Вместо этого вы можете просто выполнить мета-расширение на локальном хосте и передать значение удаленному хосту.
ssh [email protected] '~/tools/run_pvt.pl $BUILD_NUMBER'
Если вы действительно хотите установить переменную окружения на удаленном хосте и использовать ее, вы можете использовать программу env
ssh [email protected] "env BUILD_NUMBER=$BUILD_NUMBER ~/tools/run_pvt.pl \$BUILD_NUMBER"
В этом случае это немного перебор, и обратите внимание
-
env BUILD_NUMBER=$BUILD_NUMBER
выполняется метаразложение на локальном
хозяйничать
- удаленная переменная среды
BUILD_NUMBER
будет использоваться с помощью
удаленная оболочка
Ответ 4
(Этот ответ может показаться излишне сложным, но насколько я знаю, его легко расширяемо и надежно в отношении пробелов и специальных символов.)
Вы можете передавать данные прямо через стандартный ввод команды 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 [email protected] '
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
.
Действительно упрощенная версия (если вам не нужна расширяемость, есть одна переменная для обработки и т.д.) Будет выглядеть так:
$ ssh [email protected] 'read foo' <<< "$foo"
Ответ 5
Побег переменной для доступа к переменным за пределами сеанса ssh: ssh [email protected] "~/tools/myScript.pl\$BUILD_NUMBER"