tmppipe=$(mktemp -u)
mkfifo -m 600 "$tmppipe"
Tidak seperti pembuatan file biasa, yang cenderung dibajak oleh file yang ada atau tautan simbolik, pembuatan pipa nama melalui mkfifo
atau fungsi yang mendasarinya membuat file baru di tempat yang ditentukan atau gagal. Sesuatu seperti : >foo
ini tidak aman karena jika penyerang dapat memprediksi output mktemp
maka penyerang dapat membuat file target untuk dirinya sendiri. Tetapi mkfifo foo
akan gagal dalam skenario seperti itu.
Jika Anda membutuhkan portabilitas POSIX penuh, mkfifo -m 600 /tmp/myfifo
aman terhadap pembajakan tetapi rentan terhadap penolakan layanan; tanpa akses ke generator nama file acak yang kuat, Anda perlu mengatur upaya coba lagi.
Jika Anda tidak peduli dengan masalah keamanan halus di sekitar file sementara, Anda dapat mengikuti aturan sederhana: membuat direktori pribadi, dan menyimpan semuanya di sana.
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 'SANGAT berhenti menjadi jahat'
sumber
trap "rm -rf '$tempdir'" EXIT HUP INT TERM
? Bisakah menjebak melakukan ekspansi variabel itu sendiri?$tempdir
pada saattrap
perintah dievaluasi, bukan pada saat jebakan dipicu. Dalam hal ini, tidak ada bedanya, kecuali bahwa kode Anda rusak parah jika nilaitempdir
berisi satu kutipan, sedangkan kode saya selalu berfungsi.$tempdir
dideklarasikan secara lokal dan harus didefinisikan secara global agar trap memiliki akses ke sana. Masuk akal sekarang ...$tempdir
nilainya tidak berubah, yang pada dasarnya dapat diterima untuk semua tujuan. Berhati-hatilah untuk tidak menggunakan nama yang sama untuk membuat beberapa file temp / direktori ...Alternatif yang lebih aman adalah menggunakan
mktemp
untuk membuat direktori dengan aman, lalu letakkan pipa bernama Anda di dalam direktori itu, lakukanrm -R $dir
untuk menyingkirkannya pada akhirnya.sumber
mktemp
direktori, karena itu adalah satu-satunya jawaban yang dapat diterima, kalau-kalau Anda tidak memperhatikan, @Gilles sudah memposting jawaban ini secara mendalam.Gunakan opsi "dry-run":
sumber
-u
opsi "tidak dianjurkan".-t
, tapi selama itu bisa diandalkan, saya akan menggunakannya.-t
berkecil hati?mkstemp()
fungsi ( linux.die.net/man/3/mkstemp ). The-t
saklar tidak berkecil hati, itu adalah-p
, saya buruk.Anda dapat menggunakan
mktemp
untuk membuat file sementara, lalu menghapusnya dan membuat pipa bernama dengan nama yang sama.Sebagai contoh:
sumber
$TMPPIPE
sebelummkfifo
menghindari masalah 'tidak aman' terkait dengan melakukanTMPPIPE=`mktemp -u` ; mkfifo $TMPPIPE
?mkfifo
sebenarnya aman, tidak seperti pembuatan file biasa dari shell. Jika tidak, membuat file kemudian menghapusnya tidak akan membantu sama sekali (sebenarnya itu akan sangat memudahkan pekerjaan penyerang dengan tidak mengharuskannya untuk menebak nama file). Jadi jawaban dogbane bekerja, tetapi pembuatan file perantara adalah komplikasi yang tidak berguna.mktemp
halaman manual yang disebut-u
opsi 'tidak aman'?mktemp -d
Anda masih mendapat beberapa poin untuk input Anda. Terima kasih atas semua bantuan Anda, saya sangat menghargainya!mktemp -u
tidak aman saat membuat file biasa, karena memberikan perlindungan terhadap penolakan layanan (jika nama yang dihasilkannya cukup tidak dapat diprediksi) tetapi tidak mencegah penyerang membuat file di bawah hidung program. Membuat fifo alih-alih file biasa adalah kasus penggunaan yang jarang yang tidak ditangani oleh halaman manual.Gunakan
mkfifo
ataumknod
di Unix, di mana dengan dua proses terpisah dapat mengakses pipa dengan nama - satu proses dapat membukanya sebagai pembaca, dan yang lainnya sebagai penulis.Pipa bernama dapat dihapus seperti file apa pun:
NamedPipe dapat digunakan file biasa untuk hanya membaca sekali.
http://www.linuxjournal.com/article/2156
sumber
mkfifo
. Itu tidak menjawab pertanyaan saya tentang pipa bernama sementara , lebih darimkdir
alamat membuat direktori sementara.mktemp
ditangani untuk membuat pipa bernama dengan aman ?mktemp
hasil itu sendiri (ofcourse dengan menghapus file temp terlebih dahulu dan kemudian berjalanmkfifo
pada yang sama).mktemp
juga dapat digunakan untuk membuat direktori sementara, coba dengan-t -d
switch.