Eu quero ser capaz de executar um comando da minha máquina usando ssh e passar pela variável de ambiente $BUILD_NUMBER
Aqui está o que estou tentando:
ssh pvt@192.168.1.133 '~/tools/myScript.pl $BUILD_NUMBER'
$BUILD_NUMBER
é definido na máquina que faz a chamada ssh e, como a variável não existe no host remoto, ela não é selecionada.
Como passo o valor de $BUILD_NUMBER
?
Respostas:
Se você usar
ao invés de
seu shell irá interpolar o
$BUILD_NUMBER
antes de enviar a string de comando para o host remoto.fonte
Variáveis em aspas simples não são avaliadas. Use aspas duplas:
O shell irá expandir as variáveis entre aspas duplas, mas não entre aspas simples. Isso mudará para a string desejada antes de ser passado para o
ssh
comando.fonte
(Esta resposta pode parecer desnecessariamente complicada, mas é facilmente extensível e robusta em relação a espaços em branco e caracteres especiais, pelo que eu sei.)
Você pode alimentar dados diretamente por meio da entrada padrão do
ssh
comando eread
de um local remoto.No exemplo a seguir,
ssh
uma linha terminada em nulo fornecendo o nome e o valor da variável.shh
próprio comando, percorremos essas linhas para inicializar as variáveis necessárias.Resultado:
Se você não precisar
export
deles, poderá usar emdeclare
vez deexport
.Uma versão realmente simplificada (se você não precisa da extensibilidade, tem uma única variável para processar, etc.) seria semelhante a:
fonte
A lista de variáveis de ambiente aceitas no SSHD por padrão inclui
LC_*
. Portanto:fonte
Conforme respondido anteriormente, você não precisa definir a variável de ambiente no host remoto. Em vez disso, você pode simplesmente fazer a meta-expansão no host local e passar o valor para o host remoto.
Se você realmente deseja definir a variável de ambiente no host remoto e usá-la, você pode usar o
env
programaNeste caso, isso é um pouco exagerado, e observe
env BUILD_NUMBER=$BUILD_NUMBER
faz a metaexpansão no host localBUILD_NUMBER
variável de ambiente remoto será usada peloshell remoto
fonte
Também é possível passar variáveis de ambiente explicitamente por meio de ssh. Requer alguma configuração do lado do servidor, portanto, esta não é uma resposta universal.
No meu caso, eu queria passar uma chave de criptografia do repositório de backup para um comando no servidor de armazenamento de backup sem ter essa chave armazenada lá, mas observe que qualquer variável de ambiente é visível em
ps
! A solução de passar a chave para stdin também funcionaria, mas eu a achei muito complicada. Em qualquer caso, veja como passar uma variável de ambiente por meio de ssh:No servidor, edite o
sshd_config
arquivo, normalmente/etc/ssh/sshd_config
e adicione umaAcceptEnv
diretiva que corresponda às variáveis que você deseja passar. Vejaman sshd_config
. No meu caso, quero passar variáveis para o backup do borg, então escolhi:Agora, no cliente, use a
-o SendEnv
opção de enviar variáveis de ambiente. A linha de comando a seguir define a variável de ambienteBORG_SECRET
e a sinaliza para ser enviada à máquina cliente (chamadabackup
). Em seguida, ele executaprintenv
lá e filtra a saída para variáveis BORG:fonte
LC_*
como Variáveis permitidas para enviar, então apenas use$LC_TvE_foo
, ou$LC_BORG_SECRET
, apenas certifique-se de não "colidir" com uma variável embutida.Escape a variável para acessar variáveis fora da sessão ssh: ssh [email protected] "~ / tools / myScript.pl \ $ BUILD_NUMBER"
fonte
'$FOO'
é equivalente a"\$FOO"
. a questão era "como passar uma variável shell com SSH?". Como já foi dito por @PatrickTrentin esta não é uma resposta correta porqueBUILD_NUMBER
a variável de ambiente não é configurada remotamente.