[linux-l] Anfängerhilfe Script

Thomas Kaepernick mast_1 at gmx.net
Fr Okt 1 09:48:22 CEST 2010


Am Mittwoch, den 29.09.2010, 20:00 +0200 schrieb Boris Kirkorowicz:
> Hallo,
> 
> Thomas Kaepernick schrieb:
> > ich habe mal soetwas ähnliches für den Internetzugang zu schreiben.
> 
> hast Du das noch, zum abgucken?

Hat letztlich nicht ganz funktioniert. Trotzdem per PM?
> 
> 
> > Die Werte des Scripts, die erhalten werden sollten habe ich dann
> > nach /var/log/MeinUnterverzeichnis schreiben lassen. Auch einzulesende
> > Werte habe ich dort in einer Datei vorgehalten.
> 
> Was ist der Vorteil dabei?
Durch das Einlesen der Datei mit den Werten mittels source, macht aus
dem Inhalt der Datei einen Bestandteil des Scripts. Du brauchst in
diesem Fall also z.B. nicht mehr die Werte irgendwie in eine Variable
bringen, denn die Zeile

TIME=50

in der Datei ist somit eine Zeile im Script. Für die Shell ist solch
eine Zeile eine Definition einer Variable mit gleichzeitigem Füllen mit
dem Wert 50. 

Dieses source kann also auch benützt werden, um häufig verwendete
Shell-Funktionen in einer separaten Datei vorzuhalten und dann jeweils
in das Script einzubinden. Sieh Dir dazu einfach mal die Startscripte
deiner Distribution an.

> 
> 
> > Dazu mußt Du dem Benutzer des Scripts das Verzeichnis schenken oder das
> > Script mit sudo etc. laufen lassen.
> 
> Sudo ist kein Problem, Verzeichnis schenken auch nicht -solange es
> einigermaßen sicher ist.
> 
> 
> > Am Dienstag, den 28.09.2010, 14:47 +0200 schrieb Boris Kirkorowicz:
> >> Ein Script wird in ~/.kde/Autostart abgelegt (natürlich für den User nur
> >> r-x), das alle Minute in eine Hilfsdatei schreibt:
> >>
> >>> if (Logfile von gestern); then
> >>>    rm Logfile
> >>> fi
> >>>
> >>> if (Größe von Logfile) > 120; then
> >>>    shutdown -h 2
> >>> fi
> >>>
> >>> touch Logfile
> > 
> > Das brauchst Du nicht unbedingt eine Datei wird angelegt, wenn in sie
> > geschrieben wird.
> 
> Schon klar, aber dann kann ich chmod nicht drauf loslassen, oder?

In der von mir vorgeschlagenen Variante brauchst Du kein chmod. Den
Befehl kannst Du ohnehin nicht auf eine Variable loslassen.
> 
> 
> >>> while true
> >>> do
> >>>    sleep 60
> >>>    chmod 777 logfile
> > 
> > Das ist wohl auch nicht unbedingt notwendig. Die Lese- und Schreibrechte
> > bekommt sie beim Anlegen automatisch. Und ausführbar muß logfile ja
> > nicht sein.
> 
> Die Schleife arbeitet ja auch nach dem Anlegen weiter. Zur Bearbeitung
> soll das Script in die Datei schreiben können, danach nicht mehr. Als
> Attribute würde 666 sicher genügen, eigentlich sogar 600. Ist aber wohl
> ziemlich egal, wenn ich mich nicht täusche.
> 
> 
> >>>    echo 1 >> Logfile
> > Hier würde ich eher damit arbeiten, die Datei als source einzulesen.
> > Also
> > source logfile
> > oder
> > . logfile
> > 
> > Dazu müßte in der Datei z.B. stehen
> > TIME=50
> > 
> > Anschließend rechnest Du in der shell mit dem Wert der Variablen TIME
> > TIME=$((TIME+1))
> > 
> > Danach habe ich dann zur Sicherheit den Wert mit dem Datum
> > zurückschreiben lassen.
> > 
> > DATE=$(date +%Y%m%d)
> > sudo echo "DATE=$DATE TIME=\
> > $TIME">  /var/log/MeinUnterverzeichnis/${USER}_logfile
> 
> Dann steht in der Datei also immer die verbleibende Restzeit? Ja, das
> wirkt irgendwie eleganter.
> 
> 
> > Dementsprechend brauchst Du oben natürlich nicht die Datei löschen
> > lassen, sondern vergleichst den Inhalt von $DATE mit dem aktuellen
> > Datum.
> 
> 
> > User heute angemeldet?:
> > Du benutzt die Umgebungsvariable USER im Dateinamen deiner Logfile
> > (s.Bsp.o.) oder schreibst deren Inhalt in die Logfile. Dann mußt Du
> > sicherstellen, daß die Einträge jeder Zeile als Variablen einander auch
> > wieder eindeutig (oder heißt es eineindeutig :)) zugeordnet werden
> > können.
> 
> Ansonsten könnte ich die Datei einfach in sein home schreiben. Oder
> spricht da etwas dagegen?
> 
> Ich habe das jetzt mal wie folgt gemacht:
> 
> ==============================timectrl.sh==============================
> #!/bin/sh
> # Fährt den Rechner nach heutiger Höchstzeit in $TIME herunter
> 
> # Variablen übersichtlich gleich zu Anfang
> logfile="/home/boris/test-log.txt"
> TIME=10
> 
> # Initiale Dateianlage für den ersten Lauf
> if [ -e $logfile ]; then
> 	echo 'Datei '$logfile' existiert bereits.'
> 	else
> 	echo 'Datei' $logfile' wird jetzt angelegt.'
> 	echo DATE=$(date +%Y%m%d) TIME=$TIME > $logfile

Die Lösung in dieser Zeile ist eleganter als meine oben.
> fi

Wozu aber eigentlich diese Test-Abfrage? Vielleicht eher andersherum
(Zum Testen die vielen echo finde ich gut, damit man sieht, was
funktioniert und was nicht):

if [ -e $logfile ]; then
	. $logfile
	echo $logfile	# z.B. zum Testen, ob /home/boris/test-log.txt 
			# eingelesen wird
else TIME=10 DATE=$(date %Y%m%d)
fi

> 
> while true
> do
> 	source $logfile
> 	TIME=$((TIME-1))
> 	if [ $(date +%Y%m%d) -gt $DATE ]; then
> 		TIME=10
> 	fi

Diese If-Anweisung würde ich vor die Schleife setzen, denn der Test muß
ja pro script-Aufruf nur einmal erfolgen.

> 	if [ $TIME -lt 0 ]; then
> 		break
> 	fi
> 	DATE=$(date +%Y%m%d)
> 	echo "DATE=$DATE TIME=$TIME"> $logfile
> # die drei Sekunden werden später durch 60 ersetzt
> # dauert mir nur zu lange zum Testen... ;-)
> 	sleep 3
> done

Du kannst doch den Test, ob noch genügend Zeit zum Weiterlaufen ist in
die while-Bedingung packen.

while [ $TIME -gt 0 ]; do
	TIME=$((STIME-1))
	echo "DATE=$DATE TIME=$TIME" > $logfile
	sleep 3
done

> echo 'Fertig!'

Auf der Konsole ist die Meldung ausreichend. Aber deine Kinder werden
wohl eher graphisch unterwegs sein. Dafür ist dann soetwas wie xdialog,
kdialog oder zenity (für Gnome). 
Problem dabei: Läuft das Script unter einem anderen User, kann er nicht
so ohne weiteres ein Fenster beim User MeineKinder öffnen.

Vielleicht hilft der Zufallsfund von Anselm Hinderling besser. Nachteil:
Du hast dann nicht mehr das Erlebnis ein eigenes Script entwickelt zu
haben.

> # sudo /sbin/shutdown -h 5 "Feierabend: speichern und beenden!"
> ==============================timectrl.sh==============================
> 
> Fehlt natürlich noch die Absicherung. Sollte ich das mit
>  chmod +w $logfile
>  (schreiben)
>  chmod -w $logfile
> machen, oder geht das anders besser?

Siehe die Mail von Volker Grabsch. 
Sonst können deine Kinder mit

kill -15 $(ps aux | grep timectrl.sh | awk '{ print $2 }')

das Script beenden. Mit killall würdest Du es ihnen dabei einfacher
machen ;-).

Ach ja, beim xdm und gdm gibt es die Möglichkeit, vom Displaymanager
beim Login vor dem eigentlichen Login Scripte ausführen zu lassen. Das
müßte mit dem kdm bestimmt auch möglich sein. Damit würde das Script
nicht unter dem Benutzer MeineKinder laufen, sondern unter dem User des
Displaymanager (also z.B. root).
> 
> 
> > Andere Variante: Schau mal in die manpage von utmp/wtmp. Dort habe ich
> > unter SEE ALSO u.a. last und who gefunden. who gibt dir aus welcher User
> > auf welchem Terminal wie lange schon eingeloggt ist. last gibt dir alle
> > login eines Users seit Bestehen der Datei wtmp aus.
> 
> Das sieht aufwendiger aus als das obige. Wäre aber sicher eine gute
> Übung zum Parsen. Mache ich vielleicht als zweite Variante, wenn die
> erste läuft.
> 
> 
> 
> Gruss                    Greetings
>        Boris Kirkorowicz
> 




Mehr Informationen über die Mailingliste linux-l