Saya telah membaca bahwa mengarahkan keluaran ke file nama tetap di /tmp
dapat menjadi risiko keamanan, karena jika penyerang (atau tidak puas) memperhatikan bahwa file /tmp/tmpfileformyscript.tmp
dibuat ketika saya menjalankan skrip saya (bahkan jika dia tidak memiliki akses baca ke saya script), misalnya dia dapat membuat symlink ln -s ~wildcard/.bashrc /tmp/tmpfileformyscript.tmp
yang akan menyebabkan saya menghancurkan .bashrc
file saya ketika saya menjalankan script saya.
Jadi sebagai gantinya saya bisa menggunakan sesuatu seperti filename="tmpfile.tmp.$RANDOM" ; echo outputtext > "$filename"
.
Namun, saya ingin menggunakan file tmp untuk caching kadang-kadang, dalam hal ini saya ingin tahu apakah "tmpfile.tmp. *" Cocok dengan apa pun di dalam /tmp
dan jika demikian, gunakan file itu daripada membuat yang baru. Sayangnya test
dan yang setara [ -f filename ]
tidak mendukung globbing file sejauh yang saya tahu.
Jadi pertanyaan saya ada dua:
- Bagaimana saya bisa dengan aman membuat tempfile? Apakah
"predictablename.$RANDOM"
praktik yang dapat diterima atau ada cara yang lebih baik (lebih aman, lebih mudah)? - Bagaimana saya dapat dengan mudah mengakses file dan / atau membangun keberadaannya nanti dengan memeriksa
predictablename
?
sumber
$TMPDIR
dan~/.cache
persis apa yang saya butuhkan. Setelah beberapa pemikiran lebih lanjut, saya menyadari bahwa satu-satunya alasan saya menginginkannya/tmp
adalah mempartisi — sehingga cache tidak dapat mengisi/home
partisi. Tetapi untuk use case ini benar-benar non-isu lengkap, jadi subdirektori~/.cache
sesuai dengan kebutuhan saya dengan sempurna dan menghindari masalah keamanan.mktemp
tidak tersedia pada AIX atau Git shell pada Windows. Sepertinyafile.$RANDOM$RANDOM
adalah solusi portabel. The$RANDOM$RANDOM
harus meningkatkan ruang untuk 2 ^ 32, dengan asumsi Bash hasil random yang independen dan tidak lemah.mktemp dirancang untuk ini. Dari halaman manual:
mktemp akan membuat file atau keluar dengan status keluar yang tidak nol. Logical or (||) memastikan bahwa skrip akan keluar jika mktemp tidak dapat membuat file. Setelah perintah ini, Anda dapat memastikan bahwa file tersebut tersedia. Tidak perlu memeriksanya lagi. Satu-satunya hal yang perlu Anda tambahkan adalah pembersihan file di akhir skrip Anda.
Dan mungkin juga saat skrip diakhiri oleh sinyal. Apakah itu perlu atau tidak adalah sesuatu yang harus Anda putuskan.
Keduanya bisa dilakukan menggunakan
trap
perintah.sumber
$RANDOM
. Tetapi kemudian bagian 2 dari pertanyaan saya — bagaimana saya bisa mengakses file itu nanti atau mengecek apakah file itu sudah ada pada skrip berikutnya? (Untuk menerapkan cache yang sangat sederhana.)