Re: awk/shell-Rätsel

From: Oliver Fromme <olli(at)lurza.secnetix.de>
Date: Wed, 14 Jan 2009 12:45:07 +0100 (CET)

Peter Wullinger wrote:
> Prinzipiell ist in Dateinamen alles erlaubt, was nicht
> "'\0'" oder "/" ist und @/sys/kern/vfs_lookup.c gibt mir
> da wohl Recht.
> [...]
> Das man solche Dateinamen eher selten anlegt ist ein
> Zugeständnis an die Benutzbarkeit solcher Namen an
> der Shell:
> [...]
> % touch "a
> b"
> % for i in `find`; do echo $i; done
> .
> ./a
> b
> %
>
> Das ist mir übrigens auch kein direkt funktionierender Workaround
> ohne Verwendung von "xargs -0" bekannt (mit IFS kann man nicht nach
> dem Null-Byte splitten, also bringt "find -print0" auch nichts).

Mit "for i in *" kriegst Du solche fiesen Dateinamen.

Gut, das ist im Gegensatz zu "find" nicht rekursiv, aber
wenn man das braucht, gibt es auch divrse Möglichkeiten:
Entweder man bildet die Rekursion mit der Shell nach,
indem man nach Verzeichnissen und anderen Dateien auf-
dröselt, oder man verwendet eine Shell, die rekursive
Wildcards unterstützt, beispielsweise kann man in der zsh
"for i in **/*" schreiben ("**" ist ein spezieller Wild-
card, der rekursiv zu "." und allen Unterverzeichnissen
expandiert wird).

Ich gebe Dir grundsätzlich recht, dass es sicherlich klüger
ist, Sonderzeichen in Dateinamen zu vermeiden. Man umgeht
damit auch Probleme, wenn man die Dateien z.B. auf Windows-
Datenträger (USB-Sticks o.ä.) kopieren oder an nicht-UNIX-
Systeme exportieren will.

Andererseits sollte man, wenn man Shell-Skripte schreibt,
diese möglichst so robust schreiben, dass sie auch mit
beliebigen Zeichen in Dateinamen zurechtkommen. Sonst
kann es passieren, dass man sich ein Sicherheitsproblem
einhandelt. Es gab schon öfters Exploits, die auf der
Verwendung »böser« Dateinamen basierten.

Zu den Gegenmaßnahmen gehört beispielsweise, find in
Kombination mit xargs niemals ohne -print0 bzw -0 zu
verwenden. Auch viele andere Tools bieten eine Option,
um nullterminierte Dateinamen zu handhaben (grep --null,
cpio -0, tar --null, sort -z usw.).

Wenn möglich, sollte man die Wildcard-Expansion der Shell
verwenden (z.B. "*"), da die Shell dann die Dateinamen
selbst liest und nichts daran verändert. Bei externen
Programmen wie find muss die Shell ja erstmal deren
Ausgabe parsen und irgendwie splitten, und da liegt der
Hase im Pfeffer.

Und wenn man im Shell-Skript noch "eval" benutzt, muss
man doppelt vorsichtig sein.

Gruß
   Olli

-- 
Oliver Fromme, secnetix GmbH & Co. KG, Marktplatz 29, 85567 Grafing b. M.
Handelsregister: Registergericht Muenchen, HRA 74606,  Geschäftsfuehrung:
secnetix Verwaltungsgesellsch. mbH, Handelsregister: Registergericht Mün-
chen, HRB 125758,  Geschäftsführer: Maik Bachmann, Olaf Erb, Ralf Gebhart
FreeBSD-Dienstleistungen, -Produkte und mehr:  http://www.secnetix.de/bsd
"File names are infinite in length, where infinity is set to 255 characters."
        -- Peter Collinson, "The Unix File System"
To Unsubscribe: send mail to majordomo(at)de.FreeBSD.org
with "unsubscribe de-bsd-questions" in the body of the message
Received on Wed 14 Jan 2009 - 12:45:12 CET

search this site