Передача переменных в удаленной команде 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 из удаленного местоположения.

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

  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 [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"