Como usar uma variável de ambiente de um host remoto usando scp?

2

Eu tenho duas máquinas, host1 e host2.

Eu gostaria de usar uma variável de ambiente de host2, de um comando scp do host1. Por exemplo, use esse tipo de comando do host1:

scp file host2@host2_adress:$FOO

onde $ FOO é definido no host2 como o caminho de um diretório. Se eu estiver usando o comando acima, o bash pesquisará entre as variáveis do host1 e não do host2.

Um exemplo prático seria usar a variável $ HOME do host2

Como fazer isso?

    
por Gwaka 08.01.2014 / 10:11

2 respostas

2

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:

  1. 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 do ssh interno e do scp externo, você será solicitado a fornecer a senha duas vezes.

  2. 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 comando scp externo e verifique se ele funciona.

  3. 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 para 3k$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 .

    
por Malte Skoruppa 08.01.2014 / 11:24
2

Eu sugiro escapar do dólar

scp file host2@host2_adress:"\$FOO"
    
por jalanb 10.10.2014 / 17:36