Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: illera88 en 30 Diciembre 2010, 00:02 am



Título: [BASH]Simplemente guardar string en una variable
Publicado por: illera88 en 30 Diciembre 2010, 00:02 am
Hola a todos!
Estoy iniciándome en esto de los scripts en bash y tengo una duda que seguro que es muys encilla de solucionar pero que por más vueltas que doy no he visto como solucionarlo.

Lo que quiero es saber como almacenar en una variable el string de una salida por pantalla de cualuqier comando.
Se que para guardar esa una salida en un archivo de texto simplemente se haría así:

Código:
#!/bin/sh
iwconfig > archivo.txt

Hasta ahi todo bien pero si quiero guardar en una variable solamente una parte del comando??
Me explico:
Por ejemplo el comando iwconfig devuelve esto por pantalla:
Código:
iwconfig
lo        no wireless extensions.

eth0      no wireless extensions.

[b]wlan0[/b]     IEEE 802.11bgn  ESSID:"JAZZTEL_C8"
          Mode:Managed  Frequency:2.462 GHz  Access Point: 00:1A:2B:4F:45:37
          Bit Rate=1 Mb/s   Tx-Power=20 dBm
          Retry  long limit:7   RTS thr:off   Fragment thr:off
          Encryption key:4530-3031-4432-3045-3942-3943-38
          Power Management:off
          Link Quality=59/70  Signal level=-51 dBm
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0


Si yo solo quiero guardar lo que he remarcado en negrita (wlan0) como lo hago????

Un saludo y gracias!!! ;);)


Título: Re: [BASH]Simplemente guardar string en una variable
Publicado por: leogtz en 30 Diciembre 2010, 08:25 am
Dependerá de lo que quieras obtener.
Código
  1. #!/bin/bash
  2. string=`iwconfig | grep -i "wlan" | cut -f 1 -d ' '`
ó
Código
  1. string=$(iwconfig | grep -i "wlan" | cut -f 1 -d ' ')
  2. echo -e "Obtenido : ${string}";

o incluso:

Código
  1. perl -E '$s = qx|iwconfig|; $s =~ m/^(wlan0.*)/m; say $1;'

Código
  1. iwconfig | grep -i "wlan0" | awk '{print $1}'

Código
  1. iwconfig | awk '/wlan/'


Título: Re: [BASH]Simplemente guardar string en una variable
Publicado por: illera88 en 30 Diciembre 2010, 12:54 pm
Dependerá de lo que quieras obtener.
Código
  1. #!/bin/bash
  2. string=`iwconfig | grep -i "wlan" | cut -f 1 -d ' '`
ó
Código
  1. string=$(iwconfig | grep -i "wlan" | cut -f 1 -d ' ')
  2. echo -e "Obtenido : ${string}";

o incluso:

Código
  1. perl -E '$s = qx|iwconfig|; $s =~ m/^(wlan0.*)/m; say $1;'

Código
  1. iwconfig | grep -i "wlan0" | awk '{print $1}'


Muchas gracias por tu respuesta... Ya había visto en otros post que eres el crack del scripting.
Pero ahi solo estas guardando si aparece algo como "wlan0" pero en vez de wlan0 puede aparecer mon0 o rausb0 o wlan1.... Lo que quiero es almacenar en una variable "A" lo que aparezca sea lo que sea.

Muchas gracias!!!


Título: Re: [BASH]Simplemente guardar string en una variable
Publicado por: leogtz en 30 Diciembre 2010, 19:45 pm
No estoy ni cerca de ser el "crack del scripting"  ;D

Bueno, generalicemos, si queremos obtener una línea en la que haya coincidencia:

Código
  1. #!/bin/bash
  2. read -p "String : " string
  3. coincidencia=`COMANDO | grep -i "${string}"`
  4. echo -e "Lo que obtuve : [ ${coincidencia} ]";
  5.  

Si queremos obtener toda la salida del comando, ejemplo:

Código
  1. #!/bin/bash
  2. coincidencia=`who`
  3. echo -e "Salida : [ ${coincidencia} ] ";
  4.  

ó
Código
  1. coincidencia=$(who)

Si no es lo que querías, ponme la salida del comando y lo que quieres obtener de dicho comando.

Saludos.


Título: Re: [BASH]Simplemente guardar string en una variable
Publicado por: illera88 en 30 Diciembre 2010, 22:27 pm
Pues en concreto quiero (para empezar) hacer algo tan sencillo como guardar en una variable INTERFAZ parte de lo que escupe el comando iwconfig:

Escupe esto:
root@bt:~# iwconfig
lo        no wireless extensions.

eth0      no wireless extensions.

wlan0     IEEE 802.11bgn  ESSID:"JAZZTEL_C8"
          Mode:Managed  Frequency:2.462 GHz  Access Point: 00:1A:2B:4F:45:37
          Bit Rate=54 Mb/s   Tx-Power=20 dBm
          Retry  long limit:7   RTS thr:off   Fragment thr:off
          Encryption key:4530-3031-4432-3045-3942-3943-38
          Power Management:off
          Link Quality=50/70  Signal level=-60 dBm
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0

Entonces lo que quiero es un script que me guarde el string "wlan0" en una variable INTERFAZ (por ejemplo). Ese wlan0 no tiene por que ser wlan0, cada vez aparece un string "aleatorio".

Un saludo y gracias de nuevo


Título: Re: [BASH]Simplemente guardar string en una variable
Publicado por: leogtz en 30 Diciembre 2010, 22:49 pm
No, disculpa pero no te entiendo. ¿Entonces cómo sabríamos qué buscar?, ¿en qué palabras nos basaríamos para recoger los datos?

Por favor, explicate mejor. O si alguien le entendió que me dé una idea.


Título: Re: [BASH]Simplemente guardar string en una variable
Publicado por: illera88 en 31 Diciembre 2010, 00:12 am
No, disculpa pero no te entiendo. ¿Entonces cómo sabríamos qué buscar?, ¿en qué palabras nos basaríamos para recoger los datos?

Por favor, explicate mejor. O si alguien le entendió que me dé una idea.

Pues supongo que habría que tomar los datos no enf unción de su "valor" o comprando strings sino por posición, es decir en este caso sería la primera palabra en el 5 salto de línea. no???
1 lo        no wireless extensions.
2
2 eth0      no wireless extensions.
4
5 wlan0     IEEE 802.11bgn  ESSID:"JAZZTEL_C8

Me entiendes???
Gracias!!!


Título: Re: [BASH]Simplemente guardar string en una variable
Publicado por: leogtz en 31 Diciembre 2010, 08:40 am
@illera88, según tu respuesta anterior, lo que tu quieres es la coincidencia con wlan0, y ya te he dado la respuesta:

Código
  1. coincidencia=`comando | grep -i "wlan0"`

Lee tus mensajes y verás que lo que pides no está claro.

A ver, trataré de adivinar. lo que tu quieres es que capture TODO lo de wlan0, es decir, ¿esto?:


Código:
wlan0     IEEE 802.11bgn  ESSID:"JAZZTEL_C8"
          Mode:Managed  Frequency:2.462 GHz  Access Point: 00:1A:2B:4F:45:37
          Bit Rate=1 Mb/s   Tx-Power=20 dBm
          Retry  long limit:7   RTS thr:off   Fragment thr:off
          Encryption key:4530-3031-4432-3045-3942-3943-38
          Power Management:off
          Link Quality=59/70  Signal level=-51 dBm
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0


Prueba lo siguiente:
Código
  1. salida=`perl -E '$s = qx(iwconfig) =~ m/^(wlan0.*^$)/sm; print $s;'`
  2. echo -e "wlan0 -> ${salida}";
  3.  



Título: Re: [BASH]Simplemente guardar string en una variable
Publicado por: illera88 en 31 Diciembre 2010, 12:50 pm
Joe hay un fallo de entendimiento aqui.
AVer lo único que quiero es que capture wlan0. Es decir que si creamos una variable A sea A = wlan0.

Y no lo quiero para este caso en concreto! lo quiero para un caso genérico en el que la salida puede ser wlan0 o puede ser rausb0 o puede ser mon0.....

ES decir puede ser que la salida sea:
iwconfig
Citar
lo        no wireless extensions.

eth0      no wireless extensions.

wlan0     IEEE 802.11bgn  ESSID:"JAZZTEL_C8"
          Mode:Managed  Frequency:2.462 GHz  Access Point: 00:1A:2B:4F:45:37
          Bit Rate=1 Mb/s   Tx-Power=20 dBm
          Retry  long limit:7   RTS thr:off   Fragment thr:off
          Encryption key:4530-3031-4432-3045-3942-3943-38
          Power Management:off
          Link Quality=59/70  Signal level=-51 dBm
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0

ó

iwconfig
Citar
lo        no wireless extensions.

eth0      no wireless extensions.

mon0     IEEE 802.11bgn  ESSID:"JAZZTEL_C8"
          Mode:Managed  Frequency:2.462 GHz  Access Point: 00:1A:2B:4F:45:37
          Bit Rate=1 Mb/s   Tx-Power=20 dBm
          Retry  long limit:7   RTS thr:off   Fragment thr:off
          Encryption key:4530-3031-4432-3045-3942-3943-38
          Power Management:off
          Link Quality=59/70  Signal level=-51 dBm
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0

ó

iwconfig
Citar
lo        no wireless extensions.

eth0      no wireless extensions.

flkd5     IEEE 802.11bgn  ESSID:"JAZZTEL_C8"
          Mode:Managed  Frequency:2.462 GHz  Access Point: 00:1A:2B:4F:45:37
          Bit Rate=1 Mb/s   Tx-Power=20 dBm
          Retry  long limit:7   RTS thr:off   Fragment thr:off
          Encryption key:4530-3031-4432-3045-3942-3943-38
          Power Management:off
          Link Quality=59/70  Signal level=-51 dBm
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0

ó

....

Y yo solo quiero guardar los 4 o 5 dógitos de wlan0, mon0, flkd5... Lo que sea.

Creo que yua está más que claro...
Un saludo y gracias



Título: Re: [BASH]Simplemente guardar string en una variable
Publicado por: leogtz en 31 Diciembre 2010, 20:40 pm
A ver, prueba el siguiente script, lo que hace es que comprueba cuál dispositivo, si wlan0, mon0 ó flkd5 está activo. Guarda en una variable el nombre del dispositivo activo:

Código
  1. #!/bin/bash
  2.  
  3. devices=(
  4. wlan0
  5. mon0
  6. flkd5
  7. );
  8.  
  9. for device in "${devices[@]}"
  10. do
  11. iwconfig | grep -i "^${device}" > /dev/null && {
  12. dispositivo=$device
  13. }
  14. done
  15.  
  16. echo -e "Dispositivo detectado : $dispositivo";
  17.  

En una sola línea:

Código
  1. #!/bin/bash
  2. dispositivo=$(iwconfig | grep "^wlan0\|mon0\|flkd5" | cut -f 1 -d' ');
  3. echo -e "Dispositivo encontrado : ${dispositivo}";
  4.  


Código
  1. #!/bin/bash
  2. dispositivo=$(iwconfig | awk '/^(wlan0|mon0|flkd5)/ {print $1}')
  3. echo -e "Dispositivo encontrado : $dispositivo";
  4.  


Título: Re: [BASH]Simplemente guardar string en una variable
Publicado por: illera88 en 3 Enero 2011, 05:17 am
Claro pero estamos en las mismas...

NO sabemos el nombre de la variable a guardar. puede ser wlan0 mon0 o lo que sea! hay que hacerlo pero en genérico apra que capture sea lo que sea no solmante en esos tres casos...
Eso no se puede hacer???

Y pensar que algo a priori tan sencillo como guardar en una variable parte de lo que escupe un comando sea luego tan dificil...

Quizás sería mejor hacerlo en otro lenguaje??? Recomendaciones???

Quiro poder luego hacerlo con interfaz gráfica...

Un saludo


Título: Re: [BASH]Simplemente guardar string en una variable
Publicado por: leogtz en 3 Enero 2011, 06:33 am
No, no es para nada dificil, solo que no nos entendimos bien, creo que en este caso sería mejor suponer que lo que quieres está en determinada línea.

Dame unos minutos.

Listo...
Código
  1. #!/usr/bin/bash
  2. dispositivo=`iwconfig | sed -n '5,5p' | awk '{print $1}'`
  3. echo -e "Dispositivo : $dispositivo";

Ahí suponemos que el dispositivo que buscas está en la línea 5 y lo obtenemos.