Odpowiedzi:
tmppipe=$(mktemp -u)
mkfifo -m 600 "$tmppipe"
W przeciwieństwie do zwykłego tworzenia pliku, który jest podatny na przejęcie przez istniejący plik lub dowiązanie symboliczne, utworzenie potoku nazw przez mkfifolub podstawową funkcję albo tworzy nowy plik w określonym miejscu, albo kończy się niepowodzeniem. Coś takiego : >foojest niebezpieczne, ponieważ jeśli osoba atakująca może przewidzieć wynik, mktemposoba atakująca może utworzyć plik docelowy dla siebie. Ale mkfifo foozawiodłby w takim scenariuszu.
Jeśli potrzebujesz pełnej przenośności POSIX, mkfifo -m 600 /tmp/myfifojest bezpieczny przed przejęciem, ale jest podatny na odmowę usługi; bez dostępu do silnego generatora losowych nazw plików konieczne byłoby zarządzanie próbami ponownych prób.
Jeśli nie przejmujesz się subtelnymi problemami związanymi z bezpieczeństwem plików tymczasowych, możesz postępować zgodnie z prostą zasadą: utwórz prywatny katalog i przechowuj wszystko.
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"
trap "rm -rf '$tempdir'" EXIT HUP INT TERM? Czy pułapka może mieć własną zmienną ekspansję?
$tempdirw momencie jego trapoceny, a nie w momencie wyzwolenia pułapki. W tym przypadku nie robi to żadnej różnicy, z wyjątkiem tego, że Twój kod psuje się okropnie, jeśli wartość tempdirzawiera pojedynczy cudzysłów, podczas gdy mój kod zawsze działa.
$tempdirzostał zadeklarowany lokalnie i musi być zdefiniowany globalnie, aby pułapka miała do niego dostęp. Ma to teraz sens ...
$tempdir wartość się nie zmienia, co jest dopuszczalne do wszystkich celów. Uważaj tylko, aby nie używać tej samej nazwy do tworzenia wielu plików tymczasowych / katalogów ...
Bezpieczniejszą alternatywą jest bezpieczne mktemputworzenie katalogu, a następnie umieszczenie nazwanego potoku w tym katalogu, a rm -R $dirna końcu pozbycie się go.
mktempkatalogu, ponieważ była to naprawdę jedyna akceptowalna odpowiedź. Na wypadek, gdybyś nie zauważył, @Gilles już opublikował tę odpowiedź dogłębnie.
Użyj opcji „rozruchu na sucho”:
mkfifo $(mktemp -ut pipe.XXX)
-uopcji „nie jest zalecane”.
-t, ale tak długo, jak działa niezawodnie, pójdę z tym.
-tjest to zniechęcone?
mkstemp()funkcję ( linux.die.net/man/3/mkstemp ). Zmiana -tnie jest zniechęcona, to jest -pmoje złe.
Możesz użyć mktempdo utworzenia pliku tymczasowego, a następnie go usunąć i utworzyć nazwany potok o tej samej nazwie.
Na przykład:
TMPPIPE=$(mktemp -t pipe.XXX) && {
rm -f $TMPPIPE
mkfifo $TMPPIPE
}
$TMPPIPEwcześniej pozwala mkfifouniknąć związanego z tym „niebezpiecznego” problemu TMPPIPE=`mktemp -u` ; mkfifo $TMPPIPE?
mkfifojest w rzeczywistości bezpieczny, w przeciwieństwie do zwykłego tworzenia plików z powłoki. Jeśli tak nie jest, utworzenie pliku, a następnie usunięcie go wcale nie pomogłoby (w rzeczywistości znacznie ułatwiłoby atakującemu zadanie, nie wymagając od niego odgadnięcia nazwy pliku). Tak więc odpowiedź dogbane działa, ale tworzenie pliku pośredniego jest bezużyteczną komplikacją.
mktempstrona podręcznika man nazywa -uopcję „niebezpieczna”?
mktemp -d, wciąż masz trochę punktów za swój wkład. Dziękuję za całą pomoc, naprawdę to doceniam!
mktemp -ujest niebezpieczny podczas tworzenia zwykłego pliku, ponieważ zapewnia ochronę przed odmową usługi (jeśli generowana nazwa jest wystarczająco nieprzewidywalna), ale nie uniemożliwia atakującemu utworzenia pliku pod nosem programu. Tworzenie fifo zamiast zwykłego pliku to rzadki przypadek użycia, którego strona man nie adresuje.
Użyj mkfifolub mknodw Uniksie, gdzie dwa oddzielne procesy mogą uzyskać dostęp do potoku według nazwy - jeden proces może otworzyć go jako czytnik, a drugi jako pisarz.
mkfifo my_pipe
gzip -9 -c < my_pipe > out.gz
cat file > my_pipe
Nazwany potok można usunąć tak jak każdy plik:
rm my_pipe
mkfifo --mode=0666 /tmp/namedPipe
gzip --stdout -d file.gz > /tmp/namedPipe
NamedPipe może być używany jako zwykły plik do odczytu tylko raz.
mkfifo. Nie odnosi się do mojego pytania dotyczącego tymczasowych nazwanych potoków, bardziej niż mkdirdotyczy tworzenia tymczasowych katalogów.
mktempdotyczące bezpiecznego tworzenia nazwanego potoku?
mktempsamego wyniku (oczywiście najpierw usuwając plik tymczasowy, a następnie działając mkfifona tym samym). mktempmożna również użyć do utworzenia katalogu tymczasowego, spróbuj z -t -dprzełącznikiem.