Você pode tentar algo assim:
scp file host2@host2_address:$(ssh host2@host2_address 'printf $FOO')
Para resolver o valor da variável $(ssh host2@host2_address 'printf $FOO')
, o shell executará internamente o comando ssh host2@host2_address 'printf $FOO'
e obterá o que esse comando imprimir como o valor da variável, que será então substituído no% externoscp
comando. É claro que é necessário buscar a variável $FOO
do host2, porque o host1 simplesmente não o conhece. Uma maneira de obtê-lo é usando ssh
como no comando acima.
Mente:
-
Você precisa ter algum tipo de autenticação de chave pública funcionando, para que o comando
ssh
interno funcione sem nenhuma entrada adicional do usuário. Caso contrário, por causa dossh
interno e doscp
externo, você será solicitado a fornecer a senha duas vezes. -
Você deve garantir que o comando
ssh
interno imprima nada, exceto a variável$FOO
. Experimente por si próprio antes de usá-lo no comandoscp
externo e verifique se ele funciona. -
Por alguma razão eu não entendo completamente, quando eu testei o comando que escrevi acima, ele não funcionaria como esperado porque a variável buscada conteria algum prefixo de controle estranho. Por exemplo, quando eu tentei copiar algo para o controle remoto
$HOME
, ele tentaria copiá-lo para3k$HOME3\/home/user
em vez de simplesmente/home/user
. Eu tive que usar o seguinte para fazê-lo funcionar:scp file host2@host2_address:$(ssh host2@host2_address 'printf $FOO' | cut -d\ -f2)
... onde
$FOO
foi$HOME
no meu caso particular, é claro.
Esta é uma solução rápida (como é bastante curta) e dinâmica (como irá buscar a variável em tempo real) que eu criei. No entanto, particularmente por causa do último ponto, acho que seria mais confiável ter um script que busca as variáveis remotas imprimindo-as primeiro em um arquivo. Mais precisamente, esse script no host1 se conectaria ao host2, imprimiria remotamente a saída de printenv
em algum arquivo no host2, buscaria esse arquivo do host2, o analisaria e exportaria os valores para variáveis de ambiente locais. Por exemplo, a variável $FOO
no host2 poderia ser colocada em uma variável $HOST2_FOO
no host1. O script a seguir faria isso:
#!/bin/bash
ssh host2@host2_address 'printenv > host2_vars.txt'
scp host2@host2_address:host2_vars.txt .
#ssh host2@host2_address 'rm host2_vars.txt' #if you like to clean up
eval $(cat host2_vars.txt | perl -pe 's/^(.*)=(.*)$/export HOST2_$1="$2"/g')
Claro, você teria que executar esse script antes do comando scp
.