Передача переменных в удаленную команду ssh - PullRequest
77 голосов
/ 23 июля 2010

Я хочу иметь возможность запускать команду с моего компьютера с помощью ssh и проходить через переменную окружения $BUILD_NUMBER

Вот что я пытаюсь:

ssh pvt@192.168.1.133 '~/tools/myScript.pl $BUILD_NUMBER'

$BUILD_NUMBER установлено на машине, выполняющей вызов ssh, и, поскольку переменная не существует на удаленном хосте, она не принимается.

Как передать значение $BUILD_NUMBER?

Ответы [ 5 ]

151 голосов
/ 23 июля 2010

Если вы используете

ssh pvt@192.168.1.133 "~/tools/run_pvt.pl $BUILD_NUMBER"

вместо

ssh pvt@192.168.1.133 '~/tools/run_pvt.pl $BUILD_NUMBER'

, ваша оболочка будет интерполировать $BUILD_NUMBER перед отправкой строки команды на удаленный хост.

26 голосов
/ 23 июля 2010

Переменные в одинарных кавычках не оцениваются.Используйте двойные кавычки:

ssh pvt@192.168.1.133 "~/tools/run_pvt.pl $BUILD_NUMBER"

Оболочка будет расширять переменные в двойных кавычках, но не в одинарных кавычках.Это изменится в желаемую строку перед передачей в команду ssh.

0 голосов
/ 10 июля 2019

(Насколько мне известно, этот ответ может показаться излишне сложным, но его легко расширять и использовать в отношении пробелов и специальных символов.)

Вы можете передавать данные прямо через стандартввод команды ssh и read из удаленного местоположения.

В следующем примере

  1. индексированный массив заполняется (для удобства) именамипеременные, значения которых вы хотите получить на удаленной стороне.
  2. Для каждой из этих переменных мы даем ssh строку с нулевым символом в конце, дающую имя и значение переменной.
  3. В самой команде 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"
0 голосов
/ 29 августа 2017

Как уже говорилось ранее, вам не нужно устанавливать переменную среды на удаленном хосте.Вместо этого вы можете просто выполнить мета-расширение на локальном хосте и передать значение на удаленный хост.

ssh pvt@192.168.1.133 '~/tools/run_pvt.pl $BUILD_NUMBER'

Если вы действительно хотите установить переменную среды на удаленном хосте и использовать ее,вы можете использовать env программу

ssh pvt@192.168.1.133 "env BUILD_NUMBER=$BUILD_NUMBER ~/tools/run_pvt.pl \$BUILD_NUMBER"

В этом случае это немного излишне, и обратите внимание:

  • env BUILD_NUMBER=$BUILD_NUMBER выполняет мета-расширение на локальном хосте
  • удаленная BUILD_NUMBER переменная окружения будет использоваться
    удаленной оболочкой
0 голосов
/ 29 августа 2017

Экранируйте переменную, чтобы получить доступ к переменным вне сеанса ssh: ssh pvt@192.168.1.133 "~ / tools / myScript.pl \ $ BUILD_NUMBER"

...