Я хочу иметь возможность запускать команду со своего компьютера с помощью ssh и передавать переменную среды $BUILD_NUMBER
Вот что я пытаюсь:
ssh pvt@192.168.1.133 '~/tools/myScript.pl $BUILD_NUMBER'
$BUILD_NUMBER
установлен на машине, выполняющей вызов ssh, и поскольку переменная не существует на удаленном хосте, она не обрабатывается.
Как передать значение $BUILD_NUMBER
?
Ответы:
Если вы используете
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
перед отправкой командной строки на удаленный хост.источник
Переменные в одинарных кавычках не оцениваются. Используйте двойные кавычки:
ssh pvt@192.168.1.133 "~/tools/run_pvt.pl $BUILD_NUMBER"
Оболочка будет раскрывать переменные в двойных кавычках, но не в одинарных. Это преобразуется в желаемую строку перед передачей
ssh
команде.источник
(Этот ответ может показаться излишне сложным, но, насколько мне известно, он легко расширяемый и надежный в отношении пробелов и специальных символов.)
Вы можете вводить данные прямо через стандартный ввод
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
.Действительно упрощенная версия (если не нужна расширяемость, имеет одну переменный процесс и т.д.) будет выглядеть следующим образом :
$ ssh user@somehost.com 'read foo' <<< "$foo"
источник
Список допустимых переменных среды на SSHD по умолчанию включает
LC_*
. Таким образом:LC_MY_BUILDN="1.2.3" ssh -o "SendEnv LC_MY_BUILDN" ssh-host 'echo $LC_MY_BUILDN' 1.2.3
источник
Также можно явно передавать переменные среды через ssh. Это требует некоторой настройки на стороне сервера, так что это не универсальный ответ.
В моем случае я хотел передать ключ шифрования репозитория резервных копий команде на сервере хранилища резервных копий, не храня этот ключ там, но обратите внимание, что любая переменная среды видна в
ps
! Решение передачи ключа по стандартному вводу тоже подойдет, но мне оно показалось слишком громоздким. В любом случае, вот как передать переменную окружения через ssh:На сервере отредактируйте
sshd_config
файл, как правило,/etc/ssh/sshd_config
и добавьтеAcceptEnv
директиву, соответствующую переменным, которые вы хотите передать. Смотритеman sshd_config
. В моем случае я хочу передать переменные в резервную копию borg, поэтому я выбрал:Теперь на клиенте используйте
-o SendEnv
возможность отправки переменных среды. Следующая командная строка устанавливает переменную среды,BORG_SECRET
а затем помечает ее для отправки на клиентский компьютер (вызываемыйbackup
). Затем он запускаетсяprintenv
там и фильтрует вывод для переменных BORG:источник
LC_*
разрешенные для отправки переменные, поэтому просто используйте$LC_TvE_foo
или$LC_BORG_SECRET
просто убедитесь, что вы не «сталкиваетесь» со встроенной переменной.Как уже было сказано ранее, вам не нужно устанавливать переменную среды на удаленном хосте. Вместо этого вы можете просто выполнить мета-расширение на локальном хосте и передать значение удаленному хосту.
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
переменная удаленной среды будет использоватьсяудаленной оболочкой
источник
Экранируйте переменную, чтобы получить доступ к переменным вне сеанса ssh: ssh pvt@192.168.1.133 "~ / tools / myScript.pl \ $ BUILD_NUMBER"
источник
'$FOO'
эквивалентно"\$FOO"
. вопрос был в том, «как передать переменную оболочки с помощью SSH?». Как уже было сказано @PatrickTrentin, это неправильный ответ, потому что тогдаBUILD_NUMBER
переменная среды не устанавливается удаленно.