Shell Script: Hilfe mit su

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Killerkarnickel
Beiträge: 2
Registriert: 03.09.2012 13:19:15

Shell Script: Hilfe mit su

Beitrag von Killerkarnickel » 03.09.2012 13:22:19

Hallo Leute.

Ich habe ein Script geschrieben und den Befehl su $USER eingebaut. Sobald ich das Script als root ausführe, soll er auf den Befehl su $USER zurückgreifen. Dies habe ich folgendermaßen versuch (ausschnitt aus dem Script)t:

Code: Alles auswählen

install_css() {
...
...
if [ `whoami` = root ]
then
 usagetype=root
 else
 usagetype=nonroot
 fi
    case "$usagetype" in
   root)
echo "Installer fuer $GS_GAME" ;
su $USER -c ;
if [ ! -d $SERVER_DIR ];
then
echo "Erstelle $SERVER_DIR" ;
echo "Bitte warten..." ;
mkdir $SERVER_DIR ;
echo "$SERVER_DIR erfolgreich erstellt!" ;
else
echo "$SERVER_DIR existiert bereits";
fi
if [ ! -d $SERVER_DIR/$GAMEDIR ];
then
echo "Erstelle $SERVER_DIR/$GAMEDIR" ;
echo "Bitte warten..." ;
mkdir $SERVER_DIR/$GAMEDIR ;
echo "$SERVER_DIR/$GAMEDIR erfolgreich erstellt!" ;
else
echo "$SERVER_DIR/$GAMEDIR existiert bereits";
fi
echo "" ;
echo "Wechsle ins Vezeichnis $SERVER_DIR/$GAMEDIR"
cd $SERVER_DIR/$GAMEDIR ;
if [ ! -f hldsupdatetool.bin ];
then
echo "Lade HLDSUpdateTool.bin runter" ;
wget http://storefront.steampowered.com/download/hldsupdatetool.bin ;
else
echo "HLDSUpdateTool.bin existiert bereits!"
fi
echo "Mache HLDSUpdateTool.bin ausfuehrbar"
chmod 777 hldsupdatetool.bin ;
echo "Fuehre HLDSUpdateTool.bin aus"
./hldsupdatetool.bin <<<"yes"
echo "Update Steam"
./steam ;
./steam ;
echo "Installiere Spiel $GS_GAME" ;
echo "################################################################"
echo "#### INFO: Die Installation KANN viel Zeit benoetigen. #########"
echo "#### Dies ist abhaengig von der Auslastung der Steamserver! ####"
echo "################################################################"
echo "Installation startet in 10 Sekunden" ;
sleep 5 ;
echo "5" ;
sleep 1 ;
echo "4" ;
sleep 1 ;
echo "3" ;
sleep 1 ;
echo "2" ;
sleep 1 ;
echo "1" ;
sleep 1 ;
echo "! Start !" ;
...
...
;;
Wenn ich dies nun ausführe bricht das Script ab dem su Befehl ab. bzw. wenn ich alle Befehle unter ' ' Setze dann führt er das Script zwar aus aber er erkennt die Variablen nicht.

Wisst ihr vllt was da falsch ist?

LG

Killerkarnickel

uname
Beiträge: 12406
Registriert: 03.06.2008 09:33:02

Re: Shell Script: Hilfe mit su

Beitrag von uname » 03.09.2012 13:54:28

Mit "su" erzeugst du mindestens einen neuen Prozess. Das ist ganz schlecht für dein Programm. Eine Lösung habe ich jedoch leider auch nicht. Wenn ich bei Shellprogrammierung nicht mehr weiter weiß (leider sehr oft) schaue ich mir Standardprogramme z.B. unterhalb von /etc/init.d an. Irgendwie wechselt z.B. auch der Apache2-Benutzer von "root" zu www-data. Leider nicht gefunden wo und wie. Musst mal ähnliche Beispiele suchen.

Benutzeravatar
r900
Beiträge: 1053
Registriert: 09.10.2011 20:06:11
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Stockholm

Re: Shell Script: Hilfe mit su

Beitrag von r900 » 03.09.2012 15:06:48

uname hat geschrieben:Mit "su" erzeugst du mindestens einen neuen Prozess.
Genau so ist es, du kannst nicht einfach irgendwo im Skript su aufrufen und erwarten dass das Skript ab dort mit anderen Rechten weiterläuft. Das su an dieser Stelle erzeugt einen neuen Prozess und wenn dieser beendet ist geht es im Skript ganz normal weiter.

Außerdem ist "su $USER" nicht gerade sinnvoll, denn wenn du das Skript als root startest ist USER=root (es sei denn du bist mittels "su -p" root geworden).

Code: Alles auswählen

$ echo $USER
benutzer1
$ su -c 'echo $USER'
root
Also nimm besser eine Variable die nicht schon von der shell benutzt wird.

Nun zu deinem eigentlichen Problem. Eine Möglichkeit wäre das Skript mit den Rechten des Benutzers neu zu starten. Ob das in deinem Fall möglich ist musst du selbst wissen.

Eine andere Möglichkeit wäre die Vorgänge in Funktionen aufzuteilen und diese mittels "export -f" der subshell die durch su erzeugt wird zugänglich zu machen.

Code: Alles auswählen

#!/bin/bash
mach_was(){
echo 'Wer bin ich?'
whoami
echo "$USER"
echo 'Und wenn ja, wie viele?'
}

export -f mach_was

su benutzer1 -c mach_was
su benutzer1 -p -c mach_was

Killerkarnickel
Beiträge: 2
Registriert: 03.09.2012 13:19:15

Re: Shell Script: Hilfe mit su

Beitrag von Killerkarnickel » 03.09.2012 21:02:20

Vielen Dank für die Antwort. So ist es nun gelungen.

LG

Antworten