7 Stimmen

Wie generiert man zufällige Dateinamen für Sockets unter Linux?

Ich möchte ein kleines Programm, das lokale Namespace-Socket verwenden und ich muss temporären Dateinamen als Adresse des Sockets verwenden.

Wie kann man also unter Linux zufällige Dateinamen erzeugen?

+ Ich verwende die Programmiersprache C unter Debian Linux.
+ Laut der GNU C Library Reference ist tmpname nicht sicher, aber die sicheren tmpfile und mkstemp erstellen. y öffnen die erzeugte Datei. Gibt es irgendwelche sicher y nicht-erstellen-öffnen Mit anderen Worten, die Funktion sollte jede andere Anfrage zur Erstellung des generierten Dateinamens unter einem bestimmten Verzeichnis verbieten.

danke.

12voto

bdonlan Punkte 213545

Wenn Sie dies in C tun, verwenden Sie mkdtemp um ein Verzeichnis zu erstellen, und legen Sie Ihr Socket in diesem Verzeichnis ab.

Andere Funktionen wie tmpnam o mktemp sind unsicher; da sie die temporäre Datei nicht für Sie erstellen und öffnen, ist es leicht möglich, einem bereits existierenden Symlink (der von einem Angreifer gesetzt wurde, der den Namen Ihrer temporären Datei erraten hat) zu einer wichtigen Datei zu folgen (wie /etc/passwd ) und überschreibt sie.

Beachten Sie, dass es keine Möglichkeit gibt, einen Pfad zu "sperren" - alles, was Sie tun können, ist, eine etwas dort. Wenn Sie dort irgendwann eine Steckdose einrichten müssen, ist es am besten, ein Verzeichnis als Platzhalter zu verwenden.

2voto

sanmai Punkte 25975

Es gibt mktemp Programm, das als Teil der GNU coreutils verfügbar ist. Siehe die Manpage für Details.

Die typische Verwendung ist so einfach wie folgt:

TEMPDIR=$(mktemp -d)
echo $TEMPDIR
touch $TEMPDIR/yourfile.txt

(Wie erwähnt in anderer Antwort ist es nur sicher, ein Verzeichnis zu erstellen.)

1voto

Gene Goykhman Punkte 1963

Sie haben nicht angegeben, welche Sprache Sie verwenden, aber in der Annahme, dass es sich um einen C/C++-Dialekt (oder eine andere Sprache mit Zugriff auf die C-Laufzeitbibliothek) handelt, könnten Sie die tmpnam Funktion.

Es gibt einige Probleme mit tmpnam, von denen das schwerwiegendste wahrscheinlich darin besteht, dass der temporäre Dateiname, den Sie zurückerhalten, nicht wirklich "gesperrt" ist, bis Sie ihn verwenden, um eine Datei zu erstellen, so dass theoretisch ein anderer Prozess die Datei vor Ihren Augen erstellen könnte. Sie müssen auch absolut sicher sein, dass der Puffer, den Sie tmpnam übergeben, genug Platz hat, um den längsten Pfad zu speichern, den Ihr Betriebssystem unterstützen kann.

Heutzutage wird empfohlen, dass Sie die tmpfile stattdessen. Dadurch wird die Datei für Sie in einem (hoffentlich atomaren) Vorgang erstellt und Sie erhalten ein Dateihandle zurück. Ein weiterer netter Vorteil ist, dass die Datei automatisch gelöscht wird, wenn Sie sie schließen. Kein Durcheinander, kein Aufhebens.

-2voto

Johan Punkte 19027

Spielen Sie mit /dev/random.

Eine schnelle Suche bei Google ergab diesen Treffer:

< /dev/urandom tr -dc A-Za-z0-9 | head -c8

Wenn Sie dasselbe in C tun möchten, öffnen Sie einfach /dev/random und wandeln Sie es in einen String um (ignorieren Sie ungültige Zeichen).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X