Wer kennt das nicht. Sie arbeiten unter SuSE 9.x und wollen drucken. Also schalten Sie den Drucker an und geben einen Druckauftrag ein - und es passiert nichts, da der Drucker im System immer noch deaktiviert ist.
Nun müssten Sie umständlich mit Root-Rechten den Drucker erst einmal aktivieren oder den Rechner mit eingeschalteten Drucker neu starten. Dieses ist notwendig da der normale User keine Rechte bei der Druckersteuerung besitzt. Genau an diesem Punkt setzt dieses Shellscript an, und erweitert die normalen Rechte des Users um die Rechte der Druckersteuerung.
Dieses Script gibt dabei jedem User die Rechte den Drucker komplett zu verwalten. Sollte einmal ein User neu angelegt werden, kann dieses Script wieder ausgeführt werden, damit auch der neue User in den Genuss der Druckersteuerung kommt.
Damit auch "Neulinge" dieses Script verstehen, wird es nun Schritt für Schritt erklärt. Am Ende des Artikels steht das Script noch einmal komplett.
Um das Script auszuführen müssen Sie sich in einem Terminal mit Rootrechten anmelden.
Das Script zeigt nun alle Schritte die es durchläuft in diesem Terminal an.
Im Script wurden drei Funktionen erstellt, GREEN, RED und BLUE die den übergebenen Text in der entsprechenden Farbe darstellen. Bei der Funktion BLUE wurde dabei auf ein Linefeed "\n" verzichtet, da hier die Ausgabe hintereinander stattfinden soll. Der Text der bei den Funktionen ausgegeben wird, erhält die Funktion in der Variablen $1. Die Funktion DESKTOP erstellt für jeden User in seinem Home-Verzeichnis sein eigenes Desktopicon.
GREEN()
{
printf "\033[32m$1\033[0m\n";
}
RED()
{
printf "\033[31m$1\033[0m\n";
}
BLUE()
{
printf "\033[34m$1\033[0m";
}
DESKTOP()
{
DATEI="$1/Printer Manager.desktop";
echo "[Desktop Entry]" > $DATEI;
echo "Comment=Drucker Verwalten" >> $DATEI;
.
.
Da dieses Script nur mit Root-Rechten auszuführen ist, wird geprüft ob der ausführende User auch wirklich Root-Rechte besitzt. Diese werden später für die Bearbeitung der Datei /etc/sudoers benötigt.
echo -n "Check Root-Rights - "
RUSER=`whoami`
RGROUP=`groups $RUSER | awk '{if ($1 == $RUSER); print $3}'`
if ! [ "$RGROUP" = "root" ]; then
echo
echo "Fehlende Berechtigung entdeckt!"
echo "Starten Sie das Script mit Root-Rechten!"
exit 1
fi
GREEN "OK"
Nun werden erst einmal die die eingerichteten User ermittelt. Diese werden dann im Terminal angezeigt. Sind keine User eingerichtet bricht das Script mit einer Fehlermeldung ab. In der zweiten Zeile wird die Variable mit den Usernamen belegt. Sollte sich das Home-Verzeichnis auf einer eigenen Partition befinden, so legt das System immer eine Datei "lost+found" mit an. Dieses Verzeichnis wird mit dem grep-Befehl heraus gefiltert falls dieses existieren sollte.
echo -n "Read Users: " AUSER=`ls /home | grep -v 'lost+found'` for i in $AUSER do BLUE "$i " done echo -n " - " if ! [ "$AUSER" == "" ]; then GREEN "OK" else RED "Fehler" echo "Es wurden keine angelegten Benutzer gefunden!" exit 1 fi
Nun wird alles für die Einträge in der Datei /etc/sudoers vorbereitet. Die benötigten Variablen werden mit den Werten gefüllt und die zur Zeit aktuelle /etc/sudoers wird einmal gesichert.
Der Variablenwerte SUDO1 und SUDO3 unterscheiden sich dabei nur in der Markierung des Backslash. Dieses muss so übergeben werden (SUDO1) damit "sed" den Inhalt später verarbeiten kann. Für diese Verarbeitung wird ein Hilfsscropt in /tmp angelegt, welches nachher wieder gelöscht wird.
SUDO1="Cmnd_Alias PRINTER = \/opt\/kde3\/bin\/kcmshell printmgr" SUDO2=" ALL = NOPASSWD: PRINTER" SUDO3="Cmnd_Alias PRINTER = /opt/kde3/bin/kcmshell printmgr" SUDO4="User_Alias PRINTERUSER =" echo -n "Save /etc/sudoers in /etc/sudoers.old - " mv /etc/sudoers /etc/sudoers.old if [ $? -eq 0 ]; then GREEN "OK" else RED "Fehler" exit 1 fi SED_DATEI=/tmp/script.sed echo "/$SUDO1/d" > $SED_DATEI echo "/$SUDO2/d" >> $SED_DATEI echo "/$SUDO4/d" >> $SED_DATEI sed -f $SED_DATEI /etc/sudoers.old > /etc/sudoers rm $SED_DATEI GREEN "OK"
Dann werden die die neuen Werte in die Datei /etc/sudoers geschrieben. Alle User werden dabei in einer Art Liste hinterlegt. Dieses hat den Vorteil, das bereits gelöschte User die noch in der Datei /etc/sudoers stehen, dabei mit gelöscht werden.
DATEI=/etc/sudoers FIRST=0 echo -n "Insert User in /etc/sudoers - " echo "$SUDO3" >> $DATEI echo -n "User_Alias PRINTERUSER = " >> $DATEI for i in $AUSER do if [ "$FIRST" == "0" ]; then echo -n "$i" >> $DATEI FIRST=1 else echo -n ", $i" >> $DATEI fi done echo "" >> $DATEI echo "PRINTERUSER$SUDO2" >> $DATEI
Wenn die Datei /etc/sudoers nicht exakt die Rechte "600:root:root" wird die Datei sudoers von dem SuSE-Betriebssystem ignoriert und nicht ausgeführt, da dass System erkannt hat, das die Datei "unsicher" geworden ist.
chmod 640 $DATEI
Anschließend wird das neue Desktop-Icon für jeden User erzeugt und das alte gelöscht.
for i in $AUSER do echo -n "Create New Desktop in /home/$i - " DESKTOP "/home/$i/Desktop" chown $i:users "/home/$i/Desktop/Printer Manager.desktop" chmod 644 "/home/$i/Desktop/Printer Manager.desktop" GREEN "OK" done for i in $AUSER do echo -n "Delete Old Printer Desktop in /home/$i - " rm -f /home/$i/Desktop/Printer.desktop if [ $? -eq 0 ]; then GREEN "OK" else RED "Fehler" fi done
Da dieses Script von überall her ausgeführt werden kann, wird es nun in das Verzeichnis /usr/local/bin kopiert damit man dieses auch später wiederfindet, falls es noch einmal ausgeführt werden sollte.
if ! [ "`pwd`" == "/usr/local/bin" ]; then echo -n "Copie Programm to /usr/local/bin/rootprinter.sh - " rm -f /usr/local/bin/rootprinter.sh cp $0 /usr/local/bin/rootprinter.sh chmod 744 /usr/local/bin/rootprinter.sh GREEN "OK" fi
| Der Autor |
|
Zu Linux kam der Autor mit der SuSE 6.1 Distribution. Nach einem Studium der Elektrotechnik und den ersten Jahren als Programmierer, ist er heute als Systemadministrator und in der Projektierung tätig. Zu erreichen ist über die Linux User Group / Barmbeker Linux Stammtisch in Hamburg. |