Muss Pipe eine temporäre Datei schreiben?

11

Ich habe festgestellt, dass, wenn ich eine große Datenmenge zwischen zwei Prozessen über Pipe übertrage, eine temporäre Datei von Linux im Verzeichnis / tmp erstellt wird. Wenn der Pipe-Vorgang erfolgreich ist, wird die entsprechende temporäre Datei vom Betriebssystem automatisch entfernt. Wenn der Vorgang jedoch fehlschlägt, bleibt die tmp-Datei dort.

Aus irgendeinem Grund möchte ich nicht, dass der Benutzer die Möglichkeit hat, die von mir über Pipe übertragenen Daten abzurufen. Daher möchte ich nicht, dass noch etwas auf der Festplatte verbleibt, selbst wenn mein Programm abstürzt. Wie kann ich das machen?

Solotim
quelle
4
Ich bin sehr zweifelhaft, dass es das Betriebssystem ist, das diese Dateien erstellt, insbesondere bezweifle ich, dass es sich um die Pipe-Operation handelt.
@Neil: Sehr guter Punkt. @OP: Sind Sie sicher, dass der Empfänger die auf stdin empfangenen Daten nicht in der tmp-Datei zwischenspeichert? Wenn es sich nicht um Ihren eigenen Code und nicht um Open Source handelt, können Sie dies wahrscheinlich überprüfen, indem Sie Ihre Ausgabe von Ihrem Absender in eine Datei umleiten und diese dann als Eingabestream an den Empfängerprozess senden, z . B.: sender > filenameDann receiver < filename. Ich würde während beider Operationen nach der tmp-Datei suchen, um zu sehen, ob entweder der Absender oder der Empfänger dies tut.
2
Keine Antwort, aber ich habe hier viele nützliche Informationen zum Umgang mit Rohren gefunden: < slacy.com/blog/2008/12/on-mkfifo-and-doing-the-impossible >. Ich weiß nicht, wie maßgeblich diese Person ist, aber er erwähnt ausdrücklich, dass eine mkfifoerstellte Pipe niemals (überhaupt!) Puffert und niemals Dateien erstellt.
Carl Smotricz
1
@ Carl Smotricz: Link ist kaputt, also hier: slacy.com/blog/2008/12/on-mkfifo-and-doing-the-impossible
Außerdem wird das Schreiben in eine Pipe blockiert, wenn die Pipe zu voll ist (bis jemand vom anderen Ende liest).

Antworten:

11
  1. Pipes speichern keine Daten auf der Festplatte. / bin / echo foo | Die Grep-Leiste erstellt keine Dateien. Versuchen Sie strace -f sh -c '/bin/echo foo | grep bar' , alle Systemaufrufe anzuzeigen, die von einer Shell ausgeführt werden, wenn eine Pipeline ausgeführt wird. echoist eine eingebaute Shell, daher habe ich vorgeschlagen /bin/echo, die Shell als ausführbare Datei auszuführen.

  2. /tmpmuss nicht auf der Festplatte sein. Es kann auf tmpfs gemountet werden (dh durch virtuellen Speicher gesichert). Beachten Sie, dass /tmpin diesem Fall ein Neustart leer ist. Verwenden /var/tmpSie ihn daher für alles, was Sie in der Nähe lassen möchten.

Wenn Sie Daten in eine Datei einfügen, wird keine Pipe verwendet. Wenn es sich bei der Datei um eine FIFO-Datei handelt, nicht um eine reguläre Datei, handelt es sich nur um ein benanntes Rendezvous, das keine Daten enthält. Verwenden Sie ls -l, um dies herauszufinden.

Und beachten Sie, dass Sie, wenn Sie verhindern möchten, dass Benutzer sehen, was in Prozessen, die sie besitzen, durch Pipes läuft, so ziemlich SOL sind, da Sie stracealles überprüfen können, was ein Prozess tut, der mit etwas außerhalb des Prozesses interagiert, außer dem Lesen / Schreiben von mmapped shared Erinnerung. ltraceist noch invasiver. Wenn Ihr Programm auf Systemen ausgeführt wird, auf denen der lokale Benutzer root hat, können Sie diese überhaupt nicht stoppen. Unter Unix kann root alles und verfügt über leistungsstarke Tools für diesen Zweck.

Peter Cordes
quelle
1

Eine echte Pipe ist ein Speicherblock im Kernel, ein Puffer, der von einigen Prozessen gelesen / geschrieben wird. Es werden nirgendwo Dateien erstellt.

Einige Apps verfügen über Optionen, die zwischen der Verwendung von Pipes (schneller, keine Festplatte, benötigt etwas mehr Speicher) und der Verwendung von temporären Dateien (benötigt etwas weniger Speicher, sodass Sie möglicherweise die temporären Dateien sehen können, ein bisschen langsamer) wechseln. gccist eine solche Anwendung, obwohl wahrscheinlich andere sind.

Reiche Homolka
quelle
0

Dirty Hack: Verschlüsseln Sie die Daten vor dem Senden und entschlüsseln Sie sie beim Empfang, wenn Sie beide Prozesse ändern können ...

Senad Uka
quelle
Ich würde es eigentlich nicht als schmutzigen Hack bezeichnen: Wenn die Daten sensibel sind, scheint dies eine geeignete Lösung zu sein. Aber ich bin neugierig auf die tmp-Datei. Ist das OP richtig, dass der Kernel es erstellt? Oder hat Neil recht und es ist das eine oder andere Ende der Pfeife ...
Der Kernel erstellt keine temporäre Datei. Andererseits ist es sehr wahrscheinlich, dass der Empfangsprozess eine temporäre Datei erstellt. Dies ist ziemlich häufig, da Sie, wenn Sie in Ihrer Eingabe suchen möchten, diese zuerst in eine Datei schreiben müssen.
Larsks