Variáveis de ambiente sobre o bloco ssh no script de shell [duplicado]

0

Eu tenho a seguinte função:

GetHostName () {
NODE01_CHECK='cat /etc/hosts | grep -w "node01" | awk '{print $1}''
NODE02_CHECK='cat /etc/hosts | grep -w "node02" | awk '{print $1}''

IS_NODE1='ifconfig -a | grep -w $NODE01_CHECK'
IS_NODE2='ifconfig -a | grep -w $NODE02_CHECK'

if [[ ! -z $IS_NODE1 ]]; then
    echo "This is NODE 1"
fi

if [[ ! -z $IS_NODE2 ]]; then
    echo "This is Node 2"
fi

}

Este script irá identificar se um certo ip está configurado em um dos dois nós pertencentes a um cluster. Isso funciona bem localmente, mas eu preciso executá-lo remotamente de um servidor que só conhece o VIP do cluster. O objetivo é transferir alguns arquivos para os dois nós.

Então, quando eu corro:

scp -r /tmp/files CLUST_VIP 
ssh CLUST_VIP <<EOF

        NODE01_CHECK='cat /etc/hosts | grep -w "node01" | awk '{print $1}''
        NODE02_CHECK='cat /etc/hosts | grep -w "node02" | awk '{print $1}''

        IS_NODE1='ifconfig -a | grep -w $NODE01_CHECK'
        IS_NODE2='ifconfig -a | grep -w $NODE02_CHECK'

        if [[ ! -z $IS_NODE1 ]]; then
               scp -r /tmp/files node02
        fi

        if [[ ! -z $IS_NODE2 ]]; then
               scp -r /tmp/files node01
        fi

  EOF

No entanto, agora, ao executar os mesmos comandos em um bloco ssh, recebo as seguintes mensagens:

Usage: grep [OPTION]... PATTERN [FILE]...
Try 'grep --help' for more information.
Usage: grep [OPTION]... PATTERN [FILE]...
Try 'grep --help' for more information.
Pseudo-terminal will not be allocated because stdin is not a terminal.

Eu também tentei usar ssh -t e isso removeu os erros acima em relação a grep , mas as variáveis de ambiente não parecem funcionar.

Existe uma maneira de usar variáveis de ambiente em um bloco ssh?

    
por robertpas 08.12.2016 / 11:34

2 respostas

2

man bash :

The format of here-documents is:

          <<[-]word
                  here-document
          delimiter

No parameter and variable expansion, command substitution, arithmetic expansion, or pathname expansion is performed on word. If any characters in word are quoted, the delimiter is the result of quote removal on word, and the lines in the here-document are not expanded. If word is unquoted, all lines of the here-document are subjected to parameter expansion, command substitution, and arithmetic expansion, the character sequence \<newline> is ignored, and \ must be used to quote the characters \, $, and '.

    
por 08.12.2016 / 12:15
2

Suas variáveis e subshells estão sendo executados antes de enviá-lo pelo SSH. Você pode ver isso se você substituir seu comando ssh por cat . Você pode citar EOF para evitar essa expansão (como destacado na resposta de AlexP), ou, como você já está fazendo um scp acima dessa etapa, basta colocar isso em um script e executá-lo do outro lado.

Como você está usando o bash-isms, você pode considerar isso de qualquer maneira, caso isso seja executado por alguém que não use bash como shell.

Além disso, grep pode processar arquivos, portanto você não precisa cat de um arquivo, e está faltando um destino no comando IS_NODE2 block scp .

    
por 08.12.2016 / 12:30