Erweiterte Druckersteuerung

Am Beispiel einer Novell SuSE 9.x Distribution

von Günther Zander

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.


 Script: rootprinter.sh 

#! /bin/sh
#
# /usr/local/bin/rootprinter.sh
#
# Programm zum Anlegen einer Desktopverknuepfung um die
# Drucker, als User, mit Root-Rechten zu verwalten
# Guenther Zander, April 2006

# Meldung in green mit LF 
GREEN() { 
	printf "\033[32m$1\033[0m\n";
	}
	
# Meldung in red mit LF 
RED()   { 
	printf "\033[31m$1\033[0m\n";
	}

# Meldung in Blue ohne LF 
BLUE()  { 
	printf "\033[34m$1\033[0m";
	}

# Neuen Desktop erstellen	
DESKTOP() {
	DATEI="$1/Printer Manager.desktop";
	echo "[Desktop Entry]" > $DATEI;
	echo "Comment=Drucker Verwalten" >> $DATEI;
	echo "Comment[de]=Drucker Verwalten" >> $DATEI;
	echo "Encoding=UTF-8" >> $DATEI;
	echo "Exec=sudo kcmshell printmgr" >> $DATEI;
	echo "GenericName=Druckerverwaltung" >> $DATEI;
	echo "GenericName[de]=Druckerverwaltung" >> $DATEI;
	echo "Icon=printer1" >> $DATEI;
	echo "MimeType=" >> $DATEI;
	echo "Name=Printer Manager" >> $DATEI;
	echo "Name[de]=Printer Manager" >> $DATEI;
	echo "Path=" >> $DATEI;
	echo "StartupNotify=true" >> $DATEI;
	echo "Terminal=false" >> $DATEI;
	echo "TerminalOptions=" >> $DATEI;
	echo "Type=Application" >> $DATEI;
	echo "X-DCOP-ServiceType=" >> $DATEI;
	echo "X-KDE-SubstituteUID=false" >> $DATEI;
	echo "X-KDE-Username=" >> $DATEI;
	}

# check root-Rechte
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"

# Ermittlung der zur Zeit angelegten Benutzer
# Das Verzeichnis 'lost+found' ist vorhanden, wenn das 
# Home-Verzeichnis auf einer eigenen Partition liegt und 
# darf nicht mit bearbeitet werden.
#
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

# Alte Eintraege in /etc/sudoers suchen und loeschen
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 ="

# /etc/sudoers sichern
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

echo -n "Delete old Entries in /etc/sudoers - "
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"

# User einfuegen in /etc/sudoers
DATEI=/etc/sudoers
FIRST=0
echo -n "Insert User in /etc/sudoers - "
echo "$SUDO3" >> $DATEI
#
# Es werden alle verfuegbaren User in einer Liste hinterlegt.
# Dieses hat den Vorteil, das bei einem erneuten Aufruf die 
# bereits geloeschten Benutzer auch aus der sudo-Datei verschwinden.
#
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 die exakten Rechte 640 besitzt,
# so wird diese Datei nicht von dem Programm sudo eingelesen.
#
chmod 640 $DATEI
GREEN "OK"

#Desktops erstellen
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

# Delete old Printerdesktop
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

# Programm kopieren
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

exit
	
Letzte Änderung: 12.May.2010