ssh dentro de um script com 'comando' ao invés de 'comando'

0

Eu estou tentando executar comandos em vários nós do nosso cluster automaticamente através de um simples script. Eu vi que posso correr:

#!/bin/bash
echo "Machine: "$HOSTNAME;
ssh machine2 'echo Machine: $HOSTNAME;'
echo "Machine: "$HOSTNAME;

e obtenho os resultados esperados:

Machine: machine1
Machine: machine2
Machine: machine1

No entanto, eu gostaria de executar comandos mais complicados que exigirão variáveis, portanto, precisarei usar " em vez de ' para os comandos após o ssh . No entanto, o ssh parece não funcionar se eu fizer assim:

#!/bin/bash
echo "Machine: "$HOSTNAME;
ssh machine2 "echo Machine: $HOSTNAME;"
echo "Machine: "$HOSTNAME;

retorna:

Machine: machine1
Machine: machine1
Machine: machine1

Eu vi outras questões que declaram especificamente executar comandos dessa maneira usando " , então estou perdendo o que está acontecendo aqui.

    
por drjrm3 11.03.2015 / 13:56

2 respostas

1

Acho que o que você está tentando perguntar é como misturar e comparar variáveis que devem ser avaliadas localmente com aquelas que precisam ser avaliadas remotamente.

Uma opção é escrever um script para as ações a serem manipuladas remotamente, encapsulando qualquer referência a variáveis locais para que as aspas do host local não possam vê-las para expandi-las.

Outra opção para um segmento realmente curto é misturar suas citações, assim:

FRUIT=apples
ssh machine2 "echo Eating $FRUIT "'on $HOSTNAME'

Variáveis no segmento de aspas duplas serão avaliadas localmente (antes que o ssh seja executado). Tudo no segmento com aspas simples será tratado como um literal. As duas strings entre aspas serão concatenadas para criar a string echo Eating apples on $HOSTNAME e o resultado passado como um literal a ser avaliado remotamente.

    
por 11.03.2015 / 14:30
1

Você pode ver por si mesmo:

[user@bluepc ~]$ echo "$HOSTNAME;"
bluepc;
[user@bluepc ~]$ echo '$HOSTNAME;'
$HOSTNAME;

Variáveis de ambiente dentro de aspas simples são tratadas como strings.

No caso do ssh, se você usa aspas duplas:

  • A string é substituída no servidor local.
  • O comando é executado remotamente.

se você usa aspas simples:

  • A string é passada como tal no servidor remoto.
  • A substituição ocorre remotamente
  • O comando é executado
por 11.03.2015 / 14:00