KALF Computertechniek

yad/ zenity variabelen

Zenity en de fork/opvolger YAD (yet another dialog) bieden een grafische schil om je bash-scripts.
Waarom Zenity én YAD? Zenity wordt al sinds een aantal jaren niet meer doorontwikkeld: het is niet slecht, het is beperkt.

Yad (the fork) daarentegen is en blijft up-to-date, met handige en nieuwe gimmicks.
Als voorbeeld: het hele verhaal hieronder zou zich met Yad niet eens voordoen!

Verander "zenity" in "yad" en voila: het probleem verdwijnt als sneeuw voor de zon.
Voor compatibiliteit met mijn oudere scripts hou ik zowel Zenity als Yad op al mijn systemen geinstalleerd; waneer niet in gebruik eten ze geen brood, toch?
 

het script:

Onderstaand script stuurt interactief een éénzijdig berichten over het LAN en/of WAN
Het is een handig hulpmiddel b.v. wanneer je de gebruiker op een systeem waarop je remote werkzaamheden verricht te laten weten dat het systeem niet afgesloten mag worden.
In het eerste script werkt het alleen als de gebruiker op de remote computer dezelfde naam heeft als de gebruiker op het lokale systeem. In het tweede en uiteindelijke script maakt het niet uit,

zenity 1 Zenity 2
VRAAG + voorbeeld: Hoe krijg ik deze gebruikersvariabelen verwerkt in een script?
#!/bin/sh
#~/scripts/lanmess2
# Copyleft-2012-Frank Kalf, Delft-Netherlands
# Via dit script kan men een bericht sturen aan trusted systemen/gebruikers op het LAN
# Maak op alle systemen een "trusted key" aan en wissel deze uit via de commando's:
# $>ssh-keygen
# $>ssh-copy-id gebruikersnaam@ipno
#
# Alternatief: start script via de terminal en type indien gevraagd het (ssh) password.
# ('sshpass' werkt hier niet)
#
# OPTIE: radio- of checklijst? wijzig in de adresregel --checklist in --radiolist
#
# Variabelen ???
# Weergegeven op naam maar kan ook per IP-nummer
# Bij gebruik van DHCP (niet statische IP's) is het gebruik van namen aan te bevelen,
# volgens het "/etc/hosts" file:
#
# 192.168.1.30 systeem1.thuis.nu systeem1
# 192.168.1.30 systeem2.thuis.nu systeem3
# 192.168.1.30 systeem3.thuis.nu systeem3
# --------------------------------
#
# ===== Invoer van het bericht =====
bericht=$(zenity --entry --text "Bericht typen" --entry-text=); echo $bericht
#
# Bepaal de geadresseerde aan de hand van de hostnamen op het LAN (/etc/hosts)
aan=$(zenity --list --text "Naar wie een bericht sturen?" --checklist --height=250 --column "Kies"
--column "Computer" FALSE "systeem1" FALSE "systeem2" FALSE "systeem3" --separator=':'); 
echo $aan

# ===== Verzending van het bericht =====
ssh -X $aan zenity --info --text=${bericht} --no-markup --display=:0 
#-----------------------------------------------------------------------
# eventueel ter verfraaing: vul aan met een pipe (|), na "--display=:0" ==>
#  | zenity --progress --pulsate --auto-close --auto-kill --text="Pending..."
# om te kunnen volgen of/wanneergaan het bericht gelezen is.
#
# TODO 1: detach zenity script zodat bericht op de remote terminal niet verdwijnt 
# wanneer lokaal het programma en/of de computer afgesloten wordt
# TODO 2: zend bericht onder gebruikersnaam op de host.
#-----------------------------------------------------------------------

Deze modus is te omslachting en ingewikkeld, Bovendien werkt ie niet!wink

oplossing

Verlaat het pad als hierboven gekozen en gebruik de "CASE" module.
Los het probleem van de verplichte "aaneengesloten_tekst" op door zenity in te wisslen voor YAD.

#!/bin/sh
# $>lanmess
# Copyleft-2012-Frank Kalf, Delft-Netherlands
# Via dit script kan men een bericht sturen aan trusted systemen/gebruikers op het LAN & WAN
# Installer op alle systemen "Zenity", maak een "trusted key" aan en wissel deze uit via:
# $>ssh-keygen
# $>ssh-copy-id gebruikersnaam@ipno
#
# Alternatief: start script via de terminal en type indien gevraagd het (ssh) password.
# ('sshpass' werkt hier niet)
#
# ===== Invoer van het bericht =====
bericht=$(zenity --entry --text "Bericht typen" --entry-text=); echo $bericht
#
# ===== Bepaal de geadresseerde aan de hand van de hostnamen op het LAN (/etc/hosts) =====
aan=$(zenity --list --text "Naar wie een bericht sturen?" --checklist --height=250
 --column "Kies" --column "Computer" FALSE "systeem1" FALSE "systeem2" FALSE "systeem3"
  --separator=':');
echo $aan
#====== Verwerk de variabele "aan" met case/ esac ==============
case $aan in
    systeem1 )
           ssh -X user@systeem1 zenity --info --text=${bericht} --no-markup --display=:0
         ;;
    systeem2 )
            ssh -X user@systeem2 zenity --info --text=${bericht} --no-markup --display=:0
         ;;
    systeem3 )
            ssh -X user@systeem3 zenity --info --text=${bericht} --no-markup --display=:0
         ;;
esac

Let erop dat in de melding, indien deze uit meerdere woorden bestaat, de woorden met bv. "_ of - of . " verbonden dienen te zijn.
Zenity leest in de variabele "$bericht" anders alleen het eerste woord.

Drucken