2010-03-18 21 views
5

Estoy escribiendo una secuencia de comandos para ssh en una lista de máquinas y comparar una variable a otro valor .. Me he encontrado con un problema (tengo un par de soluciones, pero en este momento estoy solo me preguntaba por qué este método no funciona).Variable messy bash

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

($ i habría un nombre de host Los anfitriones son de confianza, no se da ninguna solicitud de contraseña.)

Ejemplo de foo.txt:

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

Estoy asumiendo que es un problema con comillas, o se necesita en alguna parte. He intentado varios métodos (citas diferentes, usando $() en lugar de ``, etc.) pero parece que no puedo hacerlo bien. Mi script funciona correctamente usando lo siguiente:

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

Como dije, solo una curiosidad, cualquier respuesta es apreciada.

Olvidé la publicación de mi salida: awk está escupiendo toda la línea coincidente, no la segunda sección. Jugando con las comillas y un poco, parece que recibí un error sobre el comando "{print" no encontrado, etc., como si hubiera una nueva línea en alguna parte.

+0

podría obtener más respuesta de ServerFault, relacionada con mi pregunta allí: http://serverfault.com/ques ciones/99886/ssh-not-redirecting-stdout-to-local-terminal –

+0

¿Qué sucede si elimina el símbolo de intercalación del primer ejemplo? Tal vez haya un personaje invisible al comienzo de la línea. – danben

+0

@Lance Roberts: esta pregunta es sobre awk, no sobre ssh, y como tal es apropiado para el desbordamiento de pila. – danben

Respuesta

5

sshd da a su comando para ejecutar fiesta, por lo que va a ir a través del intérprete bash en el lado remoto, así como el lado que está ejecutando la secuencia de comandos en. Veamos su comando:

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

Acaba de escapar adecuadamente el $2 para su máquina local para que la escritura del golpe que estés de ejecución no interpretarlo. Sin embargo, todas las cotizaciones están siendo eliminados por el momento en que llega a awk (no estoy del todo seguro de por qué las comillas internas se eliminan) y se está ejecutando este:

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

bash en el lado remoto ve $ 2 y la reemplaza con una cadena vacía, dejándolo con esto:

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

Es por eso que imprime toda la línea. Entonces, ¿cómo lo arreglas? Puede escapar de lo que bash en el lado remoto estará ejecutando con una barra, así:

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

Además, sólo se puede repetir el comando para ver qué fiesta que realmente está ejecutando para depurar más problemas que vienen a través de:

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

No es que las comillas se eliminen arbitrariamente, sino que el shell en el lado remoto las interpreta. Escribe la línea de comando. Citarlo para el shell remoto. Citarlo para el shell local. –

+0

¡Ahhh estaba cerca! ¡Gracias! – Kyle

+0

@Chris Johnsen: me había confundido al experimentar cuando pasé '' ... \ '{print \ $ 2} \' .. "'. Estaba viendo en el lado remoto que correctamente tenía '' 'alrededor de la expresión, pero todavía faltaba el' $ 2'. Pero después de leer lo que dijiste tiene sentido porque está reemplazando el '\ '' con ''' al mismo tiempo que sustituye '$ 2'. Sabía que no era magia, simplemente no podía explicarlo de inmediato. ;) Gracias por aclararlo. – indiv

0

intenta utilizar la sintaxis $() medida de lo posible

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