Test Foro de elhacker.net SMF 2.1

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í:


#!/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:
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 (bash) [Seleccionar]
#!/bin/bash
string=`iwconfig | grep -i "wlan" | cut -f 1 -d ' '`

ó
Código (bash) [Seleccionar]
string=$(iwconfig | grep -i "wlan" | cut -f 1 -d ' ')
echo -e "Obtenido : ${string}";


o incluso:

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

Código (bash) [Seleccionar]
iwconfig | grep -i "wlan0" | awk '{print $1}'

Código (bash) [Seleccionar]
iwconfig | awk '/wlan/'
Título: Re: [BASH]Simplemente guardar string en una variable
Publicado por: illera88 en 30 Diciembre 2010, 12:54 PM
Cita de: Leo Gutiérrez. en 30 Diciembre 2010, 08:25 AM
Dependerá de lo que quieras obtener.
Código (bash) [Seleccionar]
#!/bin/bash
string=`iwconfig | grep -i "wlan" | cut -f 1 -d ' '`

ó
Código (bash) [Seleccionar]
string=$(iwconfig | grep -i "wlan" | cut -f 1 -d ' ')
echo -e "Obtenido : ${string}";


o incluso:

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

Código (bash) [Seleccionar]
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 (bash) [Seleccionar]
#!/bin/bash
read -p "String : " string
coincidencia=`COMANDO | grep -i "${string}"`
echo -e "Lo que obtuve : [ ${coincidencia} ]";


Si queremos obtener toda la salida del comando, ejemplo:

Código (bash) [Seleccionar]
#!/bin/bash
coincidencia=`who`
echo -e "Salida : [ ${coincidencia} ] ";


ó
Código (bash) [Seleccionar]
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
Cita de: Leo Gutiérrez. 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.

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 (bash) [Seleccionar]
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?:


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 (bash) [Seleccionar]
salida=`perl -E '$s = qx(iwconfig) =~ m/^(wlan0.*^$)/sm; print $s;'`
echo -e "wlan0 -> ${salida}";


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
Citarlo        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
Citarlo        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
Citarlo        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 (bash) [Seleccionar]
#!/bin/bash

devices=(
wlan0
mon0
flkd5
);

for device in "${devices[@]}"
do
iwconfig | grep -i "^${device}" > /dev/null && {
dispositivo=$device
}
done

echo -e "Dispositivo detectado : $dispositivo";


En una sola línea:

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



Código (bash) [Seleccionar]
#!/bin/bash
dispositivo=$(iwconfig | awk '/^(wlan0|mon0|flkd5)/ {print $1}')
echo -e "Dispositivo encontrado : $dispositivo";
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 (bash) [Seleccionar]
#!/usr/bin/bash
dispositivo=`iwconfig | sed -n '5,5p' | awk '{print $1}'`
echo -e "Dispositivo : $dispositivo";


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