tmppipe=$(mktemp -u)
mkfifo -m 600 "$tmppipe"
Im Gegensatz zur regulären Dateierstellung, bei der die Gefahr besteht, dass eine vorhandene Datei oder eine symbolische Verknüpfung sie überfällt, erstellt die Erstellung einer Namenspipe durch mkfifo
die zugrunde liegende Funktion entweder eine neue Datei an der angegebenen Stelle oder schlägt fehl. So etwas : >foo
ist unsicher, denn wenn der Angreifer die Ausgabe vorhersagen mktemp
kann, kann er die Zieldatei für sich selbst erstellen. Aber mkfifo foo
würde in einem solchen Szenario fehlschlagen.
Wenn Sie eine vollständige POSIX-Portierbarkeit benötigen, mkfifo -m 600 /tmp/myfifo
ist dies sicher gegen Entführung, aber anfällig für einen Denial-of-Service. Ohne Zugriff auf einen starken Zufallsgenerator für Dateinamen müssten Sie Wiederholungsversuche verwalten.
Wenn Sie sich nicht um die subtilen Sicherheitsprobleme bei temporären Dateien kümmern, können Sie eine einfache Regel befolgen: Erstellen Sie ein privates Verzeichnis, und bewahren Sie alles dort auf.
tmpdir=
cleanup () {
if [ -n "$tmpdir" ] ; then rm -rf "$tmpdir"; fi
if [ -n "$1" ]; then kill -$1 $$; fi
}
tmpdir=$(mktemp -d)
trap 'cleanup' EXIT
trap 'cleanup HUP' HUP
trap 'cleanup TERM' TERM
trap 'cleanup INT' INT
mkfifo "$tmpdir/pipe"
Gilles 'SO - hör auf böse zu sein'
quelle
trap "rm -rf '$tempdir'" EXIT HUP INT TERM
? Kann Trap seine eigene variable Expansion machen?$tempdir
zum Zeitpunkt dertrap
Auswertung des Befehls erweitert, nicht zum Zeitpunkt des Auslösens des Traps. In diesem Fall macht es keinen Unterschied, außer dass Ihr Code schrecklich kaputt geht, wenn der Wert vontempdir
ein einfaches Anführungszeichen enthält, während mein Code immer funktioniert.$tempdir
lokal deklariert wurde und global definiert werden muss, damit trap darauf zugreifen kann. Macht jetzt Sinn ...$tempdir
Wert nicht ändert, was grundsätzlich für alle Zwecke akzeptabel ist. Achten Sie nur darauf, nicht denselben Namen zu verwenden, um mehrere temporäre Dateien / Verzeichnisse zu erstellen ...Eine sicherere Alternative ist es
mktemp
, ein Verzeichnis sicher zu erstellen, dann die Named Pipe in dieses Verzeichnis zu setzen undrm -R $dir
es am Ende zu entfernen.quelle
mktemp
Verzeichnis zu erstellen , da dies die einzig akzeptable Antwort war. Nur für den Fall, dass Sie es nicht bemerkt haben, hat @Gilles diese Antwort bereits ausführlich gepostet.Verwenden Sie die Option "Trockenlauf":
quelle
-u
Option "nicht empfohlen".-t
, aber solange es zuverlässig funktioniert, würde ich damit gehen.-t
davon abgeraten wird?mkstemp()
Funktion aufruft ( linux.die.net/man/3/mkstemp ). Der-t
Schalter ist nicht entmutigt, es ist-p
mein schlechtes.Sie können verwenden
mktemp
eine temporäre Datei erstellen, diese dann löschen und eine Named Pipe mit demselben Namen erstellen.Beispielsweise:
quelle
$TMPPIPE
vor demmkfifo
Vermeiden Sie die ‚unsicher‘ Problem, das zu tunTMPPIPE=`mktemp -u` ; mkfifo $TMPPIPE
?mkfifo
ist im Gegensatz zur normalen Dateierstellung über die Shell tatsächlich sicher. Wenn dies nicht der Fall wäre, würde das Erstellen und Löschen einer Datei überhaupt nicht helfen (tatsächlich würde dies die Arbeit des Angreifers erheblich erleichtern, da er den Dateinamen nicht erraten muss). Die Antwort von dogbane funktioniert also, aber die Zwischenerstellung von Dateien ist eine nutzlose Komplikation.mktemp
Manpage die-u
Option 'unsicher' genannt hat?mktemp -d
dich benutzt habe, hast du immer noch ein paar Punkte für deine Eingabe. Vielen Dank für all Ihre Hilfe, ich weiß das sehr zu schätzen!mktemp -u
ist beim Erstellen einer regulären Datei nicht sicher, da es den Schutz vor Denial-of-Service bietet (wenn der von ihm generierte Name nicht vorhersehbar genug ist), aber einen Angreifer nicht daran hindert, die Datei unter der Nase des Programms zu erstellen. Das Erstellen eines FIFO anstelle einer regulären Datei ist ein seltener Anwendungsfall, den die Manpage nicht behandelt.Verwenden Sie
mkfifo
odermknod
in Unix, wo zwei separate Prozesse über den Namen auf die Pipe zugreifen können - ein Prozess kann sie als Leser und der andere als Schreiber öffnen.Die Named Pipe kann wie jede andere Datei gelöscht werden:
NamedPipe kann als reguläre Datei nur zum einmaligen Lesen verwendet werden.
http://www.linuxjournal.com/article/2156
quelle
mkfifo
. Meine Frage zu temporären Named Pipes wird nicht mehr beantwortet , alsmkdir
das Erstellen temporärer Verzeichnisse.mktemp
die beim sicheren Erstellen einer Named Pipe auftreten?mktemp
Ergebnis selbst erzeugt (natürlich, indem Sie zuerst die temporäre Datei löschen und dannmkfifo
auf derselben ausführen ).mktemp
kann auch verwendet werden, um ein temporäres Verzeichnis zu erstellen. Versuchen Sie es mit-t -d
switch.