2013-10-24 6 views
5

Ich muss in einem Bash-Skript testen, ob ein bestimmter Benutzer ein bestimmtes Verzeichnis mit allen darin enthaltenen Dateien und Unterverzeichnissen lesen kann. Das Skript wird als root ausgeführt.Bash-Skript, um zu testen, ob ein bestimmter Benutzer ein Verzeichnis und alle darin enthaltenen Dateien lesen kann?

den angegebenen Benutzernamen Unter der Annahme $user und das Verzeichnis Test ist $dir ich die folgende Zeile in dem Skript

es
 
su -m $user -c "test -r $dir && test -x $dir" 
if [ $? -ne ]; then 
    echo "$dir is not readable or executable" 
fi 

Würden Sie richtig vorschlagen oder verbessern hinzugefügt?

Antwort

4

Man könnte einfach sagen:

su -m $user -c "find $dir >/dev/null 2>&1 || echo $dir is not readable or executable" 

Das die nicht lesbar oder ausführbare Nachricht erzeugen würde, wenn alle Dateien/Verzeichnisse innerhalb $dir nicht lesbar sind.

find $dir würde einen Fehlercode ungleich Null zurückgeben, wenn er keine Datei lesen kann.


EDIT: Ein vollständigere (oder zuverlässig) Weg, um alle Verzeichnisse zu finden/Dateien, die nicht lesbar sind wäre zu sagen:

find . \(-type d -perm /u+r -o -type d -perm /u+x -o -type f -perm /u+r \) 
+0

Es sieht aus wie „finden“ 0 zurück, auch wenn einige Dateien nicht lesbar sind. Wie kann ich testen, dass _alle_ Dateien in $ dir von $ user gelesen werden können? – Michael

+0

@Michael Siehe oben bearbeiten. – devnull

+0

Danke. Es funktioniert jetzt. – Michael

4
  1. Es scheint hier etwas zu fehlen:

    if [ $? -ne ]; then 
    

    Sicherlich bedeutete Sie schreiben:

    if [ $? -ne 0 ]; then 
    

    Aber in der Tat ist der Test nicht erforderlich, da Sie || verwenden können:

    su -m $user -c "test -r $dir && test -x $dir" || 
    echo "$dir is not readable or executable" 
    
  2. Statt:

    test -r $dir && test -x $dir 
    

    Sie die -a Option (logische und) zu test verwenden können:

    test -r $dir -a -x $dir 
    
  3. Woher kommt die Variable $user? Ist es vertrauenswürdig? Wenn nicht, wird es Probleme geben, wenn jemand einen Wert wie root; liefert. Auch wenn Sie sicher sind, dass $user in diesem Fall in Ordnung ist, ist es immer noch lohnt sich, in die Gewohnheit, Ihre Variablen in Shell-Skripten zu zitieren: hier würden Sie sicher sein, wenn Sie geschrieben hatte:

    su -m "$user" -c "..." 
    
  4. Es gibt eine ähnliche ist Problem, wenn $dir nicht vertrauenswürdig ist - jemand könnte einen Wert wie /; sh liefern. Aber in diesem Fall unter Angabe es so nicht funktionieren:

    su -m "$user" -c "test -r '$dir' -a -x '$dir'" 
    

    weil jemand könnte einen Wert wie /'; sh; echo ' liefern.Stattdessen müssen Sie die zitierte "$dir" zum Subshell als Parameter zu übergeben, die Sie dann sicher $1 verweisen auf die Verwendung:

    su -m "$user" -c 'test -r "$1" -a -x "$1"' -- "$dir" 
    
+0

Danke! Dies ist eine großartige Antwort, von der Sie lernen können – Michael