bash: root Rechte für Skript erlangen?

P

pospiech

Doppel-As
Ich habe ein Skript indem zuerst die Rechte des Users benötigt werden (damit $HOME korrekt gesetzt ist) und später Rechte vom Root, damit ich auf etc vollständig zugreifen kann. Das ganze Skript soll mir alle Konfigurationsdaten auf dem Rechner sichern.

Probiert habe ich es mit "su", aber das macht nur eine neue shell auf. "sudo" ist auch unglücklich weil es ja nicht nur eine, sondern viele Zeilen Code sind die mit root rechten ausgeführt werden sollen.

Wie macht man das also?

Matthias
 
Hm... warum nicht gleich das ganze Script mit root-Rechten laufen lassen?
Ist vielleicht nicht so schön aber mir scheint hier keine andere Möglichkeit gegeben... mag mich aber auch täuschen.

Gruß
D.
 
Das Skript kopiert erst Daten um sie dann zu komprimieren. Wenn ich das alles als root mache, haben alle Daten nicht mehr die Rechte des Users.

Das hier ist übrigens das Skript:
Code:
#!/bin/bash
#
# --------------------------------------------------------- #
# Skript zum Sichern wichtiger Einstellungen im System vor  #
# einem Update des Systems                                  #
# --------------------------------------------------------- #


# *** Variabelen *** --------------------------------------
HOME="/home/matthias"
# SAVEDIR="$HOME/SystemSicherung"
SAVEDIR="/mnt/Stuff/SICHERUNG/SystemSicherung200703"
EXCLUDE="$SAVEDIR/exclude.txt"
FONTDIR=/usr/local/share/fonts/

# --------------------------------------------------------- #
create_dir ()
{
	if [ -d "$1" ]  # Test if target directory exists.
	then
		echo "" 
	else
		mkdir $1		
	fi
	return 0   # Success.
}  

# --------------------------------------------------------- #
create_file ()
{
	if [ -e "$1" ]  # Test if target exists. 
	then
		rm $1		
	fi
	touch $1	
	return 0   # Success.
}  

# --------------------------------------------------------- #
append_DirInDir ()
{
	SEARCHDIR=$1
	WRITEFILE=$2	
	find $SEARCHDIR -maxdepth 1 -type d -not -name $SEARCHDIR -not -name . | grep $SEARCHDIR/ >> $WRITEFILE
	return 0
}
# --------------------------------------------------------- #
copy_Files ()
{
	FROMDIR=$1
	DESTDIR=$2
	create_dir $DESTDIR
	if [ -d "$FROMDIR" ]  # Test if target directory exists.
	then
		echo "> Kopieren..."
		# c: copy
		# p: keep permission	
		# x: extract
		# v: verbose
		tar cp --exclude-from=$EXCLUDE $FROMDIR | (cd $DESTDIR ; tar xpv)
	else
		echo "> Verzeichnis $FROMDIR existiert nicht"
	fi
	return 0   # Success.
}  

# --------------------------------------------------------- #
backup_Files ()
{
	FROMDIR=$1
	DESTFILE=$2
	if [ -d "$FROMDIR" ]  # Test if target directory exists.
	then
		echo "> Packen..."
		# c: copy
		# p: keep permission	
		# x: extract
		# v: verbose
		tar cpz --exclude-from=$EXCLUDE $FROMDIR > $DESTFILE
	else
		echo "> Verzeichnis $FROMDIR existiert nicht"
	fi
	return 0   # Success.
}  


# == MAIN ================================================= #
# Verzeichnis zum Speichern erstellen
create_dir $SAVEDIR

# # Sichern von ~/bin/ -------------------------------------- #
FROMDIR="$HOME/bin"
DESTDIR="$SAVEDIR/HomeBin"
DESTFILE="$SAVEDIR/HomeBin.tar.gz"
echo "> Sichern von $FROMDIR"
create_dir $DESTDIR
create_file $EXCLUDE
append_DirInDir $FROMDIR $EXCLUDE	
copy_Files $FROMDIR $DESTDIR
backup_Files $FROMDIR $DESTFILE
# 
# # Sichern von Fonts aus /usr/local/share/fonts/ ----------- #
FROMDIR="/usr/local/share/fonts/"
DESTDIR="$SAVEDIR/Fonts"
DESTFILE="$SAVEDIR/UsrLocalShareFonts.tar.gz"
echo "> Sichern von $FROMDIR"
create_dir $DESTDIR
create_file $EXCLUDE
copy_Files $FROMDIR $DESTDIR
backup_Files $FROMDIR $DESTFILE
# 
# # Sichern von .texmf ------------------------------------- #
FROMDIR="$HOME/.texmf"
DESTDIR="$SAVEDIR/HomeTexmf"
DESTFILE="$SAVEDIR/HomeTexmf.tar.gz"
echo "> Sichern von $FROMDIR"
create_dir $DESTDIR
create_file $EXCLUDE
copy_Files $FROMDIR $DESTDIR
backup_Files $FROMDIR $DESTFILE
#
# # Sichern von LocalTexmf ------------------------------------- #
FROMDIR="/usr/local/share/texmf/"
DESTDIR="$SAVEDIR/HomeLocalTexmf"
DESTFILE="$SAVEDIR/HomeLocalTexmf.tar.gz"
echo "> Sichern von $FROMDIR"
create_dir $DESTDIR
create_file $EXCLUDE
copy_Files $FROMDIR $DESTDIR
backup_Files $FROMDIR $DESTFILE
# 
# # Sichern von  .cxoffice ------------------------------------- #
FROMDIR="$HOME/.cxoffice"
DESTDIR="$SAVEDIR/HomeCxoffice"
DESTFILE="$SAVEDIR/HomeCxoffice.tar.gz"
echo "> Sichern von $FROMDIR"
create_dir $DESTDIR
create_file $EXCLUDE
copy_Files $FROMDIR $DESTDIR
backup_Files $FROMDIR $DESTFILE
# 
# # Sichern von .kde/share/apps/kmail ------------------------------------- #
FROMDIR="$HOME/.kde/share/apps/kmail"
DESTDIR="$SAVEDIR/Mail$USER"
DESTFILE="$SAVEDIR/HomeKmail$USER.tar.gz"
echo "> Sichern von $FROMDIR"
create_dir $DESTDIR
create_file $EXCLUDE
copy_Files $FROMDIR $DESTDIR
backup_Files $FROMDIR $DESTFILE
# 
# # Sichern von .kde/ ohne .kde/share/apps/kmail --------------------------- #
FROMDIR="$HOME/.kde"
DESTDIR="$SAVEDIR/HomeKDE"
DESTFILE="$SAVEDIR/HomeKDE.tar.gz"
echo "> Sichern von $FROMDIR"
create_dir $DESTDIR
create_file $EXCLUDE
echo "$HOME/.kde/share/apps/kmail" > $EXCLUDE
copy_Files $FROMDIR $DESTDIR
backup_Files $FROMDIR $DESTFILE

# Sichern von Versteckten Dateien in Home --------------------------------- #
FROMDIR="$HOME"
DESTDIR="$SAVEDIR/Home-$USER"
DESTFILE="$SAVEDIR/Home-$USER.tar.gz"
echo "> Sichern von $FROMDIR"
create_dir $DESTDIR
create_file $EXCLUDE
echo "$HOME/.kde" >> $EXCLUDE
echo "$HOME/.texmf" >> $EXCLUDE
echo "$HOME/.cxoffice" >> $EXCLUDE
cd $HOME
ls -1 $HOME >> $EXCLUDE
copy_Files $FROMDIR $DESTDIR
backup_Files $FROMDIR $DESTFILE
# 



# Sichern von /etc/ --------------------------------- #
# FROMDIR="/etc"
# DESTDIR="$SAVEDIR/etc"
# DESTFILE="$SAVEDIR/etc.tar.gz"
# echo "> Sichern von $FROMDIR"
# create_dir $DESTDIR
# create_file $EXCLUDE
# # echo "> Als Root anmelden.."
# # su 
# copy_Files $FROMDIR $DESTDIR
# backup_Files $FROMDIR $DESTFILE
# # 

# 8) /etc/ --> als Root


cd $HOME
exit 0
# --------------------------------------------------------- #
 
Dann zerteile das Script doch in zwei Skripte. Eines für die Daten des Users und das andere für die Daten in /etc. Letzteres kannst du ja dann mit root-Rechten laufen lassen.
 
Ohne dein Script jetzt im einzelnen durchgegangen zu sein... mach es doch in einem Schritt, kopieren und packen, mit tar. Mit der Option -p bleiben alle Rechte erhalten soweit ich weis.

Gruß
D.
 
Ohne dein Script jetzt im einzelnen durchgegangen zu sein... mach es doch in einem Schritt, kopieren und packen, mit tar. Mit der Option -p bleiben alle Rechte erhalten soweit ich weis.
Klar, nur möchte ich auch manchmal die Daten direkt, also nicht gepackt, auf eine CD brennen. Daher habe ich es so gelöst.

Und das das Problem irgentwie lösbar ist, ist nicht die Frage - mich interessiert aber eigentlich nur wie man es innerhalb eines Skriptes Lösen kann, bzw. wie/ob das überhaupt geht.

Matthias
 
...etwas hakelig, aber ein Versuch wert - schau Dir mal die su Option -c an...
 
Ich denke auch, dass der Vorschlag des Schlumpfes die beste Lösung ist.

Wenn ich das alles als root mache, haben alle Daten nicht mehr die Rechte des Users.

Naja,

die kannst du ja am Ende des Scripts als root auch wieder manuell ändern.
 
die kannst du ja am Ende des Scripts als root auch wieder manuell ändern.
daran dachte ich auch vorhin - warum das Skript nicht als root-Laufen lassen
und zum Ende hin mit einem chown user:group filename den Eigentümer auf den User setzen?
 

Ähnliche Themen

rsnapshot und ein Rechteproblem?

Mein erstes größeres Skript.

su normalerbenutzer -c (und das Passwort?)

SSH Anmeldung mit ADS Usern

Server-Monitoring mit RRDTool

Zurück
Oben