Transforma muy fácilmente tu script bash en una GUI con Zenity

[h]Zenity: Una herramienta para lanzar cajas de diálogos GTK desde la consola o con unos scripts bash[/h]
https://www.wifi-libre.com/img/members/3/zenity_11.jpg

Con este tema no pretendo hacer un manual sobre Zenity,
Solo quiero mostrar lo muy fácil que es hacer una GUI (Interfaz gráfica) para unos scripts bash de consola.
Lo haré con Zenity porque esta instalado por defecto en kali-Ubuntu.
Existen otras soluciones.
Si por ejemplo usamos una distribución con entrono gráfico** KDE** hay Kdialogs.
Podemos usar una aplicación escrita con Kdialog en GNOME o XFCE pero requiere instalar Kdialog y sus dependecias.
Zenity tira de** GTK **(Kit de desarrolló gráfico GImp) como lo hacen los Escritorios XFCE o GNOME
Esto hace que la integración es automática: Nuestra GUI pilla las fuentes, los iconos, los colores desde el tema y el set de icono que tenemos habilitado.
Se adapta automáticamente a la configuración de nuestro Escritorio.

El punto el mas destacable ha mi gusto es… ¡Qué fácil es Zenity!
Consultando la ayuda en consola y probando un poco en consola en consola nos podemos apañar solo.
En kali, Liux MInt y ubuntu viene de serie ya que algunas aplicaciones del sistema lo usan.
Si no lo tienes instalado

sudo apt-get install zenity

Primero, echemos un ojo a la ayuda, es muy importante:
https://www.wifi-libre.com/img/members/3/zenity_1.jpg
Con estas 16 opciones podemos hacer cosas muy interesantes…
Miramos más de cerca las opciones de “advertencia” (warning)
Un script siempre debe llevar un mensaje de error: Por ejemplo si el usuario entra 4 cuando hay tres opciones propuestas del 1 a 3

zenity --help-warning

https://www.wifi-libre.com/img/members/3/zenity_2.jpg
Lo bueno es que todo esta en Español y muy simple. :cool:
Redactamos un mensaje de error Zenity en nuestra consola bash y miramos que pasa:

zenity --warning --text="¡bSSID no conforme!"

https://www.wifi-libre.com/img/members/3/zenity_3.jpg
La consola se queda en espera a que el usuario haga clic en la advertencia con su mensaje de error

Ya que estamos miremos como haríamos para pedir a un usuario que entre un bSSID.
Lo que necesitamos es lo más básico: Hacer una pregunta y tener un campo para que el usuario responda.

zenity --entry  --text="Entrar el bSSID del AP"

https://www.wifi-libre.com/img/members/3/zenity_5.jpg

Veamos ahora como aplicar esto concretamente con el generador de PIN para Huawei HG532c
Centremos nos en la estructura del script…
[list=1]
]Recoge el bSSID (zenity --form)/]
]Efectúa una comprobación sobre la validez del BSSID (si el bSSID no es valido pondremos una advertencia con zenity --warning) /]
]Aplica los algoritmos para generar el PIN (esto se hace “en interno”)/]
]Devuelve el resultado (podemos usar zenity --info) o hacer lo en la consola “madre”/]
[/list]

Para el primer paso tenemos el dialogo preparado:

zenity --entry  --text="Entrar el bSSID del AP"

¿Cómo hacer para que se guarde el resultado en una variable llamada BSSID?
Es lo que hace el script con una orden read que recoge stdin (lo que entra el usario)
Es muy simple: declaramos la variable y la definimos con nuestro dialogo “entry”.

BSSID=$( zenity --entry  --text="Entrar el bSSID del AP" )

https://www.wifi-libre.com/img/members/3/zenity_6.jpg
Una vez el valor entrado y validado volvemos a la consola y verificamos que la variable BSSID este bien declarada
https://www.wifi-libre.com/img/members/3/zenity_7.jpg

Paso dos: la advertencia BSSID
Pongo aquí el inicio del script HG532cPIN :

read -r -ep "Insert bSSID and press [Enter]: " BSSID while ! (echo "$BSSID" | tr a-f A-F | egrep -q "^([0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}$") # Loop to check the conformity of the the entered bSSID do echo -e " \e[1m\e[31mSyntax error\e[0m : Nonconforming mac address" # test error echo -e " \e[36mPlease enter a valid bSSID (12 hexadecimal digits) example: 34:6B:D3:01:23:45 \e[0m" read -r -ep "Insert bSSID and press [Enter]: " BSSID done
La primera linea es para definir la variable BSSID y esto lo hacemos ahora con zenity.
Cada vez que empleamos una orden read (lee la entrada para poblar la variable BSSID) la podemos reemplazar por una variable que declara una **–entry **de zenity
Luego, segunda linea, se abre un bucle while.
Su condición es “mac no valida” (gracias a antares_145 por el estatuto comando sed)
Hasta que la mac no tenga 12 caracteres hexadecimales no se saldrá del bucle.
Se pondrá la advertencia (en lugar de las lineas con “echo”) y volveremos a preguntar por el bSSID (la orden read que cambiamos por la variable bSSID que acabamos de redactar)
https://www.wifi-libre.com/img/members/3/zenity_8.jpg

¿Probamos con las dos nuevas lineas?
Ejecuto el script y entro los datos en mi GUI:
https://www.wifi-libre.com/img/members/3/zenity_9.jpg
Le doy a [enter] y obtengo el resultado en consola
https://www.wifi-libre.com/img/members/3/zenity_10.jpg
Notéis que hay una advertencia “Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged
Nada grave, se debe a unos cambios en GTK y afecta a la versión inestable que uso, se arreglara un día de estos ( Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged.).

Zenity ha sido pensado para administradores y desarrolladores que quieren hacer algo rápido
Cómo veis no hay nada más fácil que un poco de zenity para hacer en tres lineas una GUI
Se pueden hacer muchas más cosas con listas interactivas, hacer notificaciones en la barra de herramienta con un balón etc…
Si queremos hacer una GUI super guapa o algo que salga de los esquemas habituales de un script interactivo está claro que con menos de 20 ordenes disponibles estamos un poco limitado.
Para hacer algo sencillo… ¡No hay nada más practico!

[list=*]
]Zenity @ Gnome/]
[/list]

Parece muy facil de usar lo, puede dar idea eso :cool:

Para evitar el mensaje de advertencia:

[quote=kcdtv]

Notéis que hay una advertencia “Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged
Nada grave, se debe a unos cambios en GTK y afecta a la versión inestable que uso, se arreglara un día de estos ( Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged.).

[list=*]
]Zenity @ Gnome/]
[/list][/quote]

Desde la consola y en este caso con el editor nano:
[ins]$nano ~/.bashrc[/ins]
Y añadiendo esta linea:

alias zenity="zenity 2>/dev/null"

En mi caso lo tengo así:

# "Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged."
alias nemo="nemo 2>/dev/null"
alias zenity="zenity 2>/dev/null"

¡Buen truco! :slight_smile:

salu2
pues a mi nada y que llevo tiempo queriendo quitar el mensaje de gtk
ya lo tenia asi

echo -ne "Zenity....." if ! hash zenity 2>/dev/null; then

y lo de alias no me funciona que suerte teneis

alias -h bash: alias: -h: opción inválida alias: uso: alias -p] [nombre[=valor] ... ]

alias -p zenity="zenity 2>/dev/null"

wifislax64 ~ # alias alias cp='cp -b' alias cpan2tgz='cpan2tgz --build-tag wifislax' alias d='dir' alias dir='/bin/ls $LS_OPTIONS --format=vertical' alias gem2tgz='TAG=wifislax gem2tgz' alias grep='grep --color=auto' alias ll='ls -l' alias ls='ls --color=auto' alias mc='. /usr/share/mc/bin/mc-wrapper.sh' alias sbopkg='TAG=slackbuilds sbopkg' alias slapt-src='TAG=slackbuilds slapt-src' alias v='vdir' alias vdir='/bin/ls $LS_OPTIONS --format=long'

Te falta ejecutar bashrc; mira este tema: Crear sus propias ordenes con los aliases