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"
Gilles „SO- przestań być zły”
źródło
trap "rm -rf '$tempdir'" EXIT HUP INT TERM
? Czy pułapka może mieć własną zmienną ekspansję?$tempdir
w momencie jegotrap
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, arm -R $dir
na końcu pozbycie się go.źródło
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”:
źródło
-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:
źródło
$TMPPIPE
wcześniej pozwalamkfifo
uniknąć związanego z tym „niebezpiecznego” problemuTMPPIPE=`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
lubmknod
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.Nazwany potok można usunąć tak jak każdy plik:
NamedPipe może być używany jako zwykły plik do odczytu tylko raz.
http://www.linuxjournal.com/article/2156
źródło
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ącmkfifo
na tym samym).mktemp
można również użyć do utworzenia katalogu tymczasowego, spróbuj z-t -d
przełącznikiem.