Czy potok musi zapisać plik tymczasowy?

11

Odkryłem, że jeśli przesyłam dużą ilość danych między dwoma procesami za pomocą potoku, jakiś plik tymczasowy zostanie utworzony przez linux w katalogu / tmp. Jeśli operacja potoku zakończy się powodzeniem, odpowiedni plik tymczasowy zostanie automatycznie usunięty przez system operacyjny. Ale jeśli operacja się nie powiedzie, plik tmp pozostaje tam.

Z jakiegoś powodu nie chcę, aby użytkownik miał możliwość uzyskania danych, które przesłałem przez trhough, więc nie chcę pozostawiać niczego na dysku twardym, nawet jeśli mój program się zawiesił. W jaki sposób mogę to zrobić?

solotim
źródło
4
Bardzo wątpię, czy to system operacyjny tworzy te pliki, szczególnie wątpię, czy to operacja potoku.
@Neil: Bardzo dobra uwaga. @OP: Czy jesteś pewien, że odbiornik nie buforuje danych, które otrzymuje na standardowym wejściu do pliku tmp? Jeśli nie jest to Twój własny kod i nie jest to oprogramowanie typu open source, prawdopodobnie możesz to sprawdzić, przekierowując dane wyjściowe od nadawcy do pliku, a następnie wysyłając je do procesu odbiorcy jako strumień wejściowy, np .: sender > filenamewtedy receiver < filename. Sprawdziłbym plik tmp podczas obu operacji, aby sprawdzić, czy nadawca lub odbiorca to robi.
2
Nie odpowiedź, ale znalazłem wiele przydatnych informacji na temat obsługi rur tutaj: < slacy.com/blog/2008/12/on-mkfifo-and-doing-the-impossible >. Nie wiem, jak autorytatywna jest ta osoba, ale konkretnie wspomina, że mkfifoutworzona rura nigdy nie buforuje (wcale!) I nigdy nie tworzy plików.
Carl Smotricz,
1
@Carl Smotricz: Link jest zepsuty, więc tutaj: slacy.com/blog/2008/12/on-mkfifo-and-doing-the-impossible
Również pisanie na potoku zostanie zablokowane, jeśli potok będzie zbyt pełny (dopóki ktoś nie przeczyta z drugiego końca).

Odpowiedzi:

11
  1. potoki nie przechowują danych na dysku. / bin / echo foo | pasek grep nie tworzy żadnych plików. spróbuj strace -f sh -c '/bin/echo foo | grep bar' zobaczyć wszystkie wywołania systemowe wykonane przez powłokę podczas uruchamiania potoku. echojest wbudowaną powłoką, więc zasugerowałem, /bin/echoaby powłoka działała jako plik wykonywalny.

  2. /tmpnie musi być na dysku. Może być montowany na tmpfs (tzn. Wspierany przez pamięć wirtualną). Pamiętaj, że /tmpw takim przypadku ponowne uruchomienie będzie puste , więc używaj /var/tmpdo wszystkiego, co chcesz zostawić.

Jeśli to, co robisz, polega na umieszczeniu danych w pliku, to nie używa potoku. Jeśli plik jest plikiem piątym, a nie zwykłym, to jest to tylko nazwane miejsce spotkania i nie zawiera danych. Użyj ls -l, aby się dowiedzieć.

I zauważ, że jeśli chcesz powstrzymać użytkowników przed zobaczeniem, co przechodzi przez potoki w procesach, których są właścicielami, jesteś stracepraktycznie SOL, ponieważ może sprawdzić wszystko, co robi proces, który wchodzi w interakcję z czymkolwiek poza procesem, z wyjątkiem odczytu / zapisu współdzielonego mmapped pamięć. ltracejest jeszcze bardziej inwazyjny. Jeśli twój program będzie działał na systemach, na których lokalny użytkownik ma root, nie możesz ich w ogóle zatrzymać. W Uniksie root może robić wszystko i ma do tego potężne narzędzia.

Peter Cordes
źródło
1

Prawdziwy potok to blok pamięci w jądrze, bufor odczytywany / zapisywany przez niektóre procesy. Nigdzie nie tworzy plików.

Niektóre aplikacje mają opcje przełączania między używaniem potoków (szybsze, bez uderzania dysku, zajmuje trochę więcej pamięci) a używaniem plików tymczasowych (zajmuje nieco mniej pamięci, pozwala ewentualnie zobaczyć pliki tymczasowe, dotyk wolniej). gccjest jedną z takich aplikacji, choć prawdopodobnie są inne.

Rich Homolka
źródło
0

Brudny włamanie: Szyfruj dane przed wysłaniem i odszyfruj je po otrzymaniu, jeśli możesz zmienić oba procesy ...

Senad Uka
źródło
Właściwie nie nazwałby tego brudnym włamaniem: jeśli dane są wrażliwe, wydaje się właściwym rozwiązaniem. Ale jestem ciekawy pliku tmp. Czy OP ma rację, że jądro go tworzy? A może Neil ma rację i to jeden koniec fajki albo drugi ...
Jądro nie tworzy pliku tymczasowego. Z drugiej strony jest bardzo prawdopodobne, że proces otrzymywania tworzy plik tymczasowy. Jest to dość powszechne, ponieważ jeśli chcesz szukać w swoich danych wejściowych, musisz najpierw zapisać je w pliku.
larsks