2017-11-09 4 views
-1

Ich habe versucht, ein Skript zu schreiben, für die Berechtigungen in Linux zu normalisieren:Ich kann nicht scheinen Argumente mit Leerzeichen in Bash-Skript zu übergeben

for f in $(find . -type f); do 
    file "$f" | grep -e "ELF 64-bit LSB executable" -e "ELF 32-bit MSB executable" > /dev/null 
    if [ $? = 0 ]; then 
     chmod -c u=rwx,g=rx,o=rx "$f" 
    else 
     chmod -c u=rw,g=r,o=r "$f" 
    fi; 
done 

Offensichtlich Ich versuche, Dateipfade zu chmod und ich passiere sind doppelte Anführungszeichen wie in "$f" verwenden, aber irgendwie noch No such file or directory Fehler bekommen:

chmod: './FreeDesktop_integration/nautilus-scripts/Archiving/PeaZip/Extract''e erişilemedi: Böyle bir dosya ya da dizin yok 
chmod: 'Archive''e erişilemedi: Böyle bir dosya ya da dizin yok 

Es scheint ./FreeDesktop_integration/nautilus-scripts/Archiving/PeaZip/Extract Archive als 2 Dateien von chmod behandelt wird (und das ist ziemlich unerwartet).

Also, was verursacht das und wie löse ich das (passiere die Argumente richtig)?

Bonus Frage: Gibt es einen besseren Weg zu tun, was ich mit dem Skript erreichen möchte?

+0

des Lesen von einer Schwester Website, super detailliert: https://unix.stackexchange.com/questions/9496/looping-through-files-with-spaces-in-the-names – Nic3500

+0

Dies ist [BashPitfalls # 1] (http: //mywiki.wooledge .org/BashPitfalls # for_i_in_.24.28ls_.2A.mp3.29); auch das Thema [Using Find] (http://mywiki.wooledge.org/UsingFind) und * zahlreiche * Duples hier auf SO (kein Hinweis auf unix.se)! –

+0

@CharlesDuffy Nun, vielen Dank für die heads-up, aber ich sehe nicht, warum diese Frage downvoted -cuz ich nicht Shell-Skripting? – NightmareX1337

Antwort

1

In for f in $(find . -type f), führt die Shell Worttrennung an der Ausgabe des Befehls find durch. So ist es nicht sicher, es wie Sie zu verwenden.

Sie können es sicher machen, indem eine while Schleife statt mit:

find . -type f -print0 | while IFS= read -r -d '' f; do 
    if file "$f" | grep -qe "ELF 64-bit LSB executable" -e "ELF 32-bit MSB executable"; then 
     chmod -c u=rwx,g=rx,o=rx "$f" 
    else 
     chmod -c u=rw,g=r,o=r "$f" 
    fi 
done 

(I vereinfachten auch die bedingt ein wenig, zusammen mit einer Reihe von Spitzen von @CharlesDuffy.)

+0

(re: ein Angriff ist jetzt nicht mehr möglich, da diese Antwort bearbeitet wird, um NUL-begrenzte Ausgaben zu verwenden) ... als konkreten Angriff betrachte man 'd = $'./Foo/\ n/etc \ n/'; mkdir -p "$ d" && berühre "$ d/f" 'bevor dieses Skript ausgeführt wird; Sie möchten vermutlich nicht, dass '/ etc' die' + x'-Berechtigungen entfernt. –

Verwandte Themen