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 mkfifo
lub podstawową funkcję albo tworzy nowy plik w określonym miejscu, albo kończy się niepowodzeniem. Coś takiego : >foo
jest niebezpieczne, ponieważ jeśli osoba atakująca może przewidzieć wynik, mktemp
osoba atakująca może utworzyć plik docelowy dla siebie. Ale mkfifo foo
zawiodłby w takim scenariuszu.
Jeśli potrzebujesz pełnej przenośności POSIX, mkfifo -m 600 /tmp/myfifo
jest 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ę?
$tempdir
w momencie jego trap
oceny, 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ść tempdir
zawiera pojedynczy cudzysłów, podczas gdy mój kod zawsze działa.
$tempdir
został 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 mktemp
utworzenie katalogu, a następnie umieszczenie nazwanego potoku w tym katalogu, a rm -R $dir
na końcu pozbycie się go.
mktemp
katalogu, 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)
-u
opcji „nie jest zalecane”.
-t
, ale tak długo, jak działa niezawodnie, pójdę z tym.
-t
jest to zniechęcone?
mkstemp()
funkcję ( linux.die.net/man/3/mkstemp ). Zmiana -t
nie jest zniechęcona, to jest -p
moje złe.
Możesz użyć mktemp
do 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
}
$TMPPIPE
wcześniej pozwala mkfifo
uniknąć związanego z tym „niebezpiecznego” problemu TMPPIPE=`mktemp -u` ; mkfifo $TMPPIPE
?
mkfifo
jest 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ą.
mktemp
strona podręcznika man nazywa -u
opcję „niebezpieczna”?
mktemp -d
, wciąż masz trochę punktów za swój wkład. Dziękuję za całą pomoc, naprawdę to doceniam!
mktemp -u
jest 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 mkfifo
lub mknod
w 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ż mkdir
dotyczy tworzenia tymczasowych katalogów.
mktemp
dotyczące bezpiecznego tworzenia nazwanego potoku?
mktemp
samego wyniku (oczywiście najpierw usuwając plik tymczasowy, a następnie działając mkfifo
na tym samym). mktemp
można również użyć do utworzenia katalogu tymczasowego, spróbuj z -t -d
przełącznikiem.