Apakah ada cara yang lebih baik secara obyektif untuk membuat file sementara di skrip bash?
Saya biasanya hanya memberi nama mereka apa pun yang muncul di pikiran saya, seperti tempfile-123, karena itu akan dihapus ketika skrip selesai. Apakah ada kerugian dalam melakukan ini selain menimpa tempfile-123 yang mungkin di folder saat ini? Atau adakah keuntungan dalam membuat file sementara dengan cara yang lebih hati-hati?
tempfile(1)
pada sistem yang memilikinya.Jawaban:
The
mktemp(1)
man page menjelaskan dengan cukup baik:Dalam sebuah skrip, saya memanggil sesuatu seperti mktemp
yang membuat direktori sementara saya dapat bekerja, dan di mana saya dapat dengan aman memberi nama file aktual sesuatu yang dapat dibaca dan berguna.
mktemp
bukan standar, tetapi ada pada banyak platform. "X" umumnya akan dikonversi menjadi beberapa keacakan, dan lebih banyak mungkin akan lebih acak; Namun, beberapa sistem (busybox ash, untuk satu) membatasi keacakan ini lebih signifikan daripada yang lainOmong-omong, pembuatan file sementara yang aman penting untuk lebih dari sekadar skrip shell. Itu sebabnya python memiliki tempfile , perl memiliki File :: Temp , ruby memiliki Tempfile , dll ...
sumber
mktemp
adalah kombinasi denganbasename
, seperti itumktemp -dt "$(basename $0). XXXXXXXXXX"
. Jika digunakan tanpabasename
Anda mungkin mendapatkan kesalahan seperti mktemp ini : templat yang tidak valid, `/tmp/MOB-SAN-JOB1-183-ScriptBuildTask-7300464891856663368.sh.XXXXXXXXXX '', mengandung pemisah direktori .mktemp -dt "$(basename $0).XXXXXXXXXX"
adalah cara yang benar.$0
, ada banyak ruang di tanah OS X.mktemp -dt "$(basename "$0").XXXXXX"
trap "rm -rf $mydir" EXIT
Ya, gunakan mktemp .
Ini akan membuat file sementara di dalam folder yang dirancang untuk menyimpan file sementara, dan itu akan menjamin Anda nama yang unik. Ini menampilkan nama file itu:
sumber
Anda mungkin ingin melihatnya
mktemp
Untuk lebih jelasnya: man mktemp
sumber
File sementara biasanya dibuat di direktori sementara (seperti
/tmp
) di mana semua pengguna dan proses lain memiliki akses baca dan tulis (skrip lain apa pun dapat membuat file baru di sana). Oleh karena itu skrip harus berhati-hati dalam membuat file seperti menggunakan dengan izin yang tepat (misalnya hanya baca untuk pemilik, lihathelp umask
:) dan nama file tidak mudah ditebak (idealnya acak). Kalau tidak, jika nama file tidak unik, itu dapat membuat konflik dengan skrip yang sama berjalan beberapa kali (misalnya kondisi balapan) atau penyerang dapat membajak beberapa informasi sensitif (misalnya ketika izin terlalu terbuka dan nama file mudah ditebak) atau membuat / mengganti file dengan versi kode mereka sendiri (seperti mengganti perintah atau pertanyaan SQL tergantung pada apa yang sedang disimpan).Anda bisa menggunakan pendekatan berikut untuk membuat direktori sementara:
atau file sementara:
Namun itu masih bisa ditebak dan tidak dianggap aman.
Sesuai
man mktemp
, kita dapat membaca:Jadi agar aman, disarankan untuk menggunakan
mktemp
perintah untuk membuat file atau direktori sementara yang unik (-d
).sumber
${0##*/}
dan$$
memperluas ke, atau tautan ke beberapa dokumentasi tentang hal itu.mktemp
mungkin yang paling serbaguna, terutama jika Anda berencana untuk bekerja dengan file untuk sementara waktu.Anda juga dapat menggunakan operator substitusi proses
<()
jika Anda hanya perlu file sementara sebagai input ke perintah lain, misalnya:sumber