ubuntuusers.de

wie kann man prüfen ob ein Verzeichnis existiert?

Status: Gelöst | Ubuntu-Version: Xubuntu 10.04 (Lucid Lynx)
Antworten |

technohead

Avatar von technohead

Anmeldungsdatum:
1. April 2007

Beiträge: 869

Hallo Leute,

ich müsste mit einem Shellscript prüfen ob das Verzeichnis /media/crypt existiert und wenn nicht dieses mit folgendem Befehl erstellen:

sudo mkdir /media/crypt
sudo chmod -R u=rwx,g+rw-x,o+rwx /media/crypt

ich vermute mal in etwa so:

if [ -d "/media/crypt"]

aber das Verzeichnis soll ja erstellt werden, wenn es nicht existiert also benötige ich irgendwo ein Ausrufezeichen für den Nicht-Operator wie schreibe ich das dann?

Vielen Dank.

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

Wozu?

In der man-Page zu mkdir steht:

Create the DIRECTORY(ies), if they do not already exist.

Insofern musst Du das ja nicht testen. Mit dem "-p" Parameter erzeugst Du alle notwendigen parent-Verzeichnisse automatisch.

1
mkdir -p /was/auch/immer

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Hi technohead,

der Vorschlag von Lysander ist der eleganteste, wie man das üblicherweise macht.

Dein Ansatz würde aber auch gehen:

if ! [ -d "/media/crypt"] ; then
	sudo mkdir /media/crypt
	# ...
fi

oder:

[ -d "/media/crypt"]  ||  sudo mkdir /media/crypt

Zum Verständnis kannst Du Dir ja mal das bash-Handbuch zu Gemüte führen: http://www.fedorawiki.de/index.php/Bash_Benutzerhandbuch_3.2_Start

LG,

track

technohead

(Themenstarter)
Avatar von technohead

Anmeldungsdatum:
1. April 2007

Beiträge: 869

Ich persönlich finde diese Variante besser:

   if ! [ -d "$mountpfad" ];then
     sudo mkdir $mountpfad;
     sudo chmod -R u=rwx,g+rw-x,o+rwx $mountpfad;
   fi

Weil bei bereits eingebundenem Laufwerk nicht das Gesamte Laufwerk wieder rekursiv geändert werden muss - Hier noch mal das gesamte Script. Damit kann man in dann auch in Xubuntu 10.04 ein verschlüsseltes Laufwerk grafisch einbinden (Thunar kann das zur Zeit noch nicht)

#!/bin/sh
# path name and mountpoint:
#
partition="/dev/sda3"; #Die Verschluesselte Partition
partions_name="privat"; #Name der Verschluesselten Partition
mountpfad="/media/crypt"; #Mountpunkt für das entschluesselte Laufwerk
#-------------------------------------------------------------------
iamsudo=1; # für die sudo-Schleife
logincounter=0; # Zähler für falsche Sudo-Kennwörter
error_max=3; # maximale Anzahl falscher Kennwörter
error_count=$error_max; # Zähler für verbleibende Falscheingaben
#---------------------------------------------------------------
tcmount_title="CryptSetup-MOUNTBOX";
errorbox_rootpw_title="CryptSetup-MOUNTBOX";
errorbox_rootpw_text1="Das eingegebene Sudo-Kennwort ist falsch!";
errorbox_partpw_text1="Das eingegebene Mount-Kennwort ist falsch!";
errorbox_rootpw_text2="\nSie koennen es noch ";
errorbox_rootpw_text3="x eingeben";
inputbox_rootpw_text="Bitte das Sudo-Kennwort eingeben:";
inputbox_partpw_text="Bitte das Partitions-Kennwort eingeben:";
errorbox_partpw_text="Die Partition wurde bereits eingaengt!";
tcumount_title="CryptSetup-UMOUNT";
inputbox_umount_text="Verschlüsseltes Laufwerk trennen?";
errorbox_umount_text="Die Laufwerks-Trennung war nicht erfolgreich!\nBitte beenden Sie zunöchst alle Zugriffe";
#----------------------------------------------------------------
# Sudo-Schleife
until [ $logincounter -eq $error_max ];do
 root_pw=$( zenity --entry --title="$tcmount_title" --text="$inputbox_rootpw_text" --hide-text );
 retval=$?;
 if [ $retval -eq 1 ];then
 break
 fi
 if [ "$root_pw" = "" ];then
 break
 fi 
 if [ $retval -eq 0 ];then
  sudo -K;
  echo $root_pw | sudo -S echo "correct";
  retval=$?;
  if [ $retval -eq 0 ];then
   logincounter=$error_max;
   iamsudo=0;
  else
   logincounter=$(expr $logincounter + 1);
   error_count=$(expr $error_max - $logincounter);
   if [ $error_count > 0 ];then
   inputbox_rootpw_text="$errorbox_rootpw_text1""$errorbox_rootpw_text2""$error_count""$errorbox_rootpw_text3"
   fi
  fi
 fi
done
# ------------------- end sudo-login ------------------------------
#-------------- Ask for cryptsetup-keyword -----------------------
 if [ $iamsudo -eq 0 ];then
logincounter=0; # Zähler für falsche Sudo-Kennwörter
error_count=$error_max; # Zähler für verbleibende Falscheingaben


if mount | grep $mountpfad; then

zenity --question --title="$tcumount_title" --text="$inputbox_umount_text";

   case $? in
    0)
    mountoff=1;;
    1)
    mountoff=0;;
    255)
    mountoff=0;;
   esac
if [ $mountoff != 0 ]; then
cd /
sudo cryptsetup luksClose $partions_name
sudo umount $mountpfad
sudo cryptsetup luksClose $partions_name
if mount | grep $mountpfad; then

zenity --warning --title="$tcumount_title" --text="$errorbox_umount_text"

fi
else
 exit 1
fi
else
until [ $logincounter -eq $error_max ];do

 pwd=$( zenity --entry --title="$tcmount_title" --text="$inputbox_partpw_text" --hide-text );

 retval=$?;
 if [ $retval -eq 1 ];then
 break
 fi
 if [ $retval -eq 0 ];then
  echo $pwd | sudo cryptsetup luksOpen $partition $partions_name;
  retval=$?;
  if [ $retval -eq 239 ];then
   zenity --warning --title="$tcmount_title" --text="$errorbox_partpw_text";
   break
  fi
  if [ $retval -eq 0 ];then
   logincounter=$error_max;
   if ! [ -d "$mountpfad" ];then
     sudo mkdir $mountpfad;
     sudo chmod -R u=rwx,g+rw-x,o+rwx $mountpfad;
   fi
   sudo mount /dev/mapper/$partions_name $mountpfad;
  else
   logincounter=$(expr $logincounter + 1);
   error_count=$(expr $error_max - $logincounter);
   if [ $error_count > 0 ];then
   inputbox_partpw_text="$errorbox_partpw_text1""$errorbox_rootpw_text2""$error_count""$errorbox_rootpw_text3";
   fi
  fi
 fi
done
fi
 else
  zenity --warning --title="$tcmount_title" --text="$errorbox_rootpw_text1";
 fi

Vielen Dank noch mal

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

technohead schrieb:

Weil bei bereits eingebundenem Laufwerk nicht das Gesamte Laufwerk wieder rekursiv geändert werden muss ...

Das tut mkdir -p auch nicht ! - der wird nur aktiv, wenn der betreffende Pfad nicht existiert. Da ist Dein Bedenken also unbegründet.

Eine Anregung noch: gewöhn Dir doch an, Einrückungen nicht um 1 Zeichen sondern konsequent um 4 Zeichen oder einen ganzen TAB tief zu machen.
Und Kommentare mit mehreren TABs erst ab Spalte 56 ... 80 beginnen zu lassen:

partions_name="privat"; 				# Name der Verschluesselten Partition
mountpfad="/media/crypt"; 				# Mountpunkt für das entschluesselte Laufwerk
#---------------------------------------------------------------------------------------------------

# ...
 	if [ $retval -eq 0 ];then
 		sudo -K;
 		echo $root_pw | sudo -S echo "correct";
 		retval=$?;
 		if [ $retval -eq 0 ];then
 		 	logincounter=$error_max;
 		 	iamsudo=0;
		else
 		 	logincounter=$(expr $logincounter + 1);
 		 	error_count=$(expr $error_max - $logincounter);
 		 	if [ $error_count > 0 ];then
				inputbox_rootpw_text="$errorbox_rootpw_text1""$errorbox_rootpw_text2""$error_count""$errorbox_rootpw_text3"
 			fi
		fi
	fi
done
# ...

if mount | grep $mountpfad; then
	zenity --question --title="$tcumount_title" --text="$inputbox_umount_text";
	case $? in
		0)	mountoff=1;;
		1)	mountoff=0;;
		255)	mountoff=0;;
	esac

	if [ $mountoff != 0 ]; then
	cd /
# ...

Das fördert die Übersicht doch sehr. (vor allem, wenn Du so ein Skript nach 3 Jahren wieder anguckst, oder jemand anderes)
Und die paar TABs verbrauchen auch praktisch keinen Speicherplatz ... (also warum da geizig sein ?)

LG,

track

Antworten |