2010-03-18 13 views
5

Sto scrivendo uno script per ssh in un elenco di macchine e confrontare una variabile con un altro valore .. Ho incontrato un problema (ho un paio di soluzioni alternative, ma a questo punto sono mi chiedo solo perché questo metodo non funziona).Messy bash variabile

VAR=`ssh $i "awk -F: '/^bar/ {print \$2}' /local/foo.txt"` 

($ sarei un hostname I padroni di casa sono attendibili, senza richiesta della password è dato.)

Esempio di foo.txt:

foo:123456:abcdef 
bar:789012:ghijkl 
baz:345678:mnopqr 

Sto assumendo che sia un problema con le virgolette, o è necessario da qualche parte. Ho provato diversi metodi (diverse quotazioni, usando $() invece di ``, ecc.) Ma non riesco a farlo bene. Il mio script funziona correttamente utilizzando il seguente:

VAR=`ssh $i "grep bar /local/foo.txt" | awk -F: '{print \$2}'` 

Come ho detto, solo una curiosità, ogni risposta è apprezzata.

Ho dimenticato di pubblicare quale era il mio output: awk sta sputando l'intera riga con corrispondenza, non la seconda sezione. Giocando con le virgolette e un po 'mi è sembrato di avere un errore riguardo al comando "{print" non trovato ecc., Come se ci fosse una nuova linea da qualche parte.

+0

Si potrebbe ottenere più risposte ServerFault, legati alla mia domanda lì: http://serverfault.com/ques tions/99886/ssh-not-redirecting-stdout-to-local-terminal –

+0

Cosa succede se si rimuove il caret dal primo esempio? Forse c'è un personaggio invisibile all'inizio della linea. – danben

+0

@Lance Roberts - questa domanda riguarda awk, non ssh, e come tale è appropriato per l'overflow dello stack. – danben

risposta

5

sshd dà il comando a bash da eseguire, quindi passerà attraverso l'interprete bash sul lato remoto e il lato su cui si sta eseguendo lo script. Diamo un'occhiata al tuo comando:

VAR=`ssh $i "awk -F: '/^bar/ {print \$2}' /local/foo.txt"` 

quali hai correttamente sfuggito il $2 per la tua macchina locale, in modo che lo script bash che stai esecuzione non interpretarla. Ma tutte le citazioni sono state rimosse per il momento si arriva a awk (io non sono del tutto sicuro perché le quotazioni interne vengono rimossi) e sta eseguendo questo:

awk -F: /^bar/ {print $2} /local/foo.txt 

bash sul lato remoto vede $ 2 e lo sostituisce con una stringa vuota, lasciandoti con questo:

awk -F: /^bar/ {print } /local/foo.txt 

Ecco perché stampa l'intera linea. Quindi come lo risolvi? Si può sfuggire quello che bash sul lato remoto sarà l'esecuzione con una barra, in questo modo:

VAR1=`ssh $i localhost "echo awk -F: '/^bar/ {print \\\$2}' /local/foo.txt"` 

Inoltre, si può solo echo il comando per vedere che cosa bash è realmente in esecuzione per eseguire il debug ulteriori problemi si arriva attraverso:

VAR1=`ssh $i localhost "echo awk -F: '/^bar/ {print \$2}' /local/foo.txt"` 
echo VAR1: $VAR1 

Execute it and see this output and see right away that it has removed $2: 
VAR1: awk -F: /^bar/ {print } /local/foo.txt 
+0

Non è che le virgolette siano state arbitrariamente rimosse, ma che la shell sul lato remoto le stia interpretando. Scrivi la riga di comando. Cita per la shell remota. Cita per la shell locale. –

+0

Ahhh ero vicino! Grazie! – Kyle

+0

@Chris Johnsen: mi sono confuso mentre sperimentavo quando ho passato '" ... \ '{print \ $ 2} \' .. "'. Stavo vedendo sul lato remoto che aveva "=" correttamente intorno all'espressione, ma il '$ 2' mancava ancora. Ma dopo aver letto quello che hai detto ha senso perché sta sostituendo il '\ '' con ''' allo stesso tempo sostituisce '$ 2'. Sapevo che non era magico, non potevo proprio spiegarlo subito. ;) Grazie per il chiarimento. – indiv

0

tenta di utilizzare la sintassi $() per quanto possibile

VAR=$(ssh $i "awk -F: '/^bar/ {print \$2}' /local/foo.txt") 
Problemi correlati