2013-07-10 3 views
5

ho bisogno di usare una variabile a distanza e una variabile locale nello stesso comando ssh remotoSSH e variabili di ambiente remoto e locale

export CASSANDRA_DIR=/opt/cassandra 

ssh [email protected] <<\EOF 
    export READ=$(grep IPADDR /etc/sysconfig/network-scripts/ifcfg-eth0 |awk -F= '{print $2}') 
    echo "listen_address: $READ" to directory "$CASSANDRA_DIR" 
EOF 

La variabile $ LEGGI sta lavorando bene, mentre la CASSANDRA_DIR non funziona. Il seguente funziona per CASSANDRA_DIR

ssh [email protected] echo "directory=$CASSANDRA_DIR" 

grazie, Dean

+0

Dove è definita la variabile '$ CASSANDRA_DIR'? –

+0

Ho modificato il post per aggiungerlo. Viene da questo script (beh, in realtà è un po 'più complicato ma per tutti gli scopi intensivi è fondamentalmente impostato nello script locale e non in quello remoto.Inoltre, sto usando "clush" che esegue il comando ssh su molti server ma lo ssh non funziona quindi il Clush cmd non funzionerà –

+0

Nit minore: 'grep ... | awk ...' può sempre essere unito come: 'awk -F = '/ IPADDR /' {print $ 2 } '/ etc/sysconfig/network-scripts/ifcfg-eth0' –

risposta

9

Quale dovrebbe essere ampliato a livello locale, mantenere il sigillo $ come è, come $foobar

Che cosa si vuole essere ampliato a distanza, si può utilizzare le barre rovesciate: \$foobar

Per impostazione predefinita in here-docs, la variabile è expande d.

Es. :

cat<< EOF 
$UID 
EOF 

Per evitare l'espansione in qui-doc, è possibile utilizzare questo modulo:

cat<< 'EOF' 
$variable_that_will_not_been_expanded 
EOF 

o il vostro:

cat<< \EOF 
$variable_that_will_not_been_expanded 
EOF 

entrambe le opere.

+0

Ho aggiunto al mio script ssh sopra le righe echo dir1 = $ CASSANDRA_DIR echo dir2 = \ $ CASSANDRA_DIR e nessuno dei due ha stampato la directory, quindi questa soluzione non ha funzionato –

+1

grazie, mi ha risolto tutto !!!! wow, rimuovendo quella "\" prima dell'EOF è stato risolto il problema quindi ora ho $ REMOTE_VAR e $ ORIGINAL_HOST_VAR ed entrambi funzionano, uno legge locale e uno legge remoto. –

1

Se non si desidera utilizzare un qui-doc si può fare in questo modo:

export CASSANDRA_DIR=/opt/cassandra 

ssh [email protected] " 
    export READ=\$(grep IPADDR /etc/sysconfig/network-scripts/ifcfg-eth0 |awk -F= \'{print \$2}\') 
    echo \"listen_address: \$READ\" to directory \"$CASSANDRA_DIR\" 
" 
+0

Sto davvero cercando di farlo funzionare con arguzia h EOF in modo tale che lo script sia molto più facile da leggere in quanto a volte ciò che è in EOF può essere di 10 righe. Non c'è modo di lavorare con EOF per utilizzare le variabili locali? –

+1

più 1 sul post poiché mi ha aiutato a combinare la risposta e la risposta sputnick al mio risultato finale. –

+0

Contento di aver potuto aiutare in qualche modo :) –

1

mio risultato finale è dunque che grandi opere (avviso I cahnge \ EOF a EOF invece !!! !! e poi fuggire le variabili remote

export CASSANDRA_DIR=/opt/cassandra 

ssh [email protected] <<EOF 
    export READ=$(grep IPADDR /etc/sysconfig/network-scripts/ifcfg-eth0 |awk -F= '{print $2}') 
    echo "listen_address: \$READ to directory $CASSANDRA_DIR" 
EOF 

il tutto funziona alla grande in quel LEGGI viene generato in remoto e CASSANDRA_DIR è la var sulla mia macchina originale.

Dean

0.123.