Bisakah kita menggunakan folder sementara seperti file sementara
TMP=$(mktemp ... )
exec 3<>$TMP
rm $TMP
cat <&3
yang akan dihancurkan secara otomatis setelah shell keluar ini?
file-descriptors
tmpfs
Bob Johnson
sumber
sumber
Jawaban:
Dalam kasus file sementara, contoh Anda dalam pertanyaan akan membuatnya, lalu memutuskan tautannya dari direktori (menjadikannya "menghilang"), dan ketika skrip menutup arsip yang diajukan (mungkin setelah penghentian), ruang yang diambil oleh file tersebut akan dapat direklamasi oleh sistem. Ini adalah cara umum untuk menangani file sementara dalam bahasa seperti C.
Sejauh yang saya tahu, tidak mungkin untuk membuka direktori dengan cara yang sama, setidaknya tidak dengan cara apa pun yang membuat direktori tersebut dapat digunakan.
Cara umum untuk menghapus file dan direktori sementara pada saat penghentian skrip adalah dengan menginstal
EXIT
perangkap pembersihan . Contoh kode yang diberikan di bawah ini menghindari keharusan menyulap para pembuat arsip sepenuhnya.Atau Anda dapat memanggil fungsi pembersihan:
The
EXIT
perangkap tidak akan dieksekusi setelah menerimaKILL
sinyal (yang tidak dapat terperangkap), yang berarti bahwa tidak akan ada pembersihan dilakukan kemudian. Namun itu akan dieksekusi ketika mengakhiri karenaINT
atauTERM
sinyal (jika berjalan denganbash
atauksh
, dalam shell lain Anda mungkin ingin menambahkan sinyal ini setelahEXIT
ditrap
baris perintah), atau ketika keluar secara normal karena sampai di akhir skrip atau menjalankanexit
panggilan.sumber
.
dan..
entri. (Diuji di Linux, saya tidak tahu apakah itu konsisten di semua platform.)exec another-command
jelas.Tulis fungsi-shell yang akan dieksekusi ketika skrip Anda jika selesai. Dalam contoh di bawah ini saya menyebutnya 'pembersihan' dan mengatur jebakan yang akan dieksekusi pada tingkat keluar, seperti: 0 1 2 3 6
Lihat posting ini untuk info lebih lanjut.
sumber
cleanup
sebelum keluar bersih (0) dan saat menerima SIGHUP (1), SIGINT (2), SIGQUIT (3) dan SIGABRT (6). itu tidak akan berjalancleanup
ketika skrip keluar karena SIGTERM, SIGSEGV, SIGKILL, SIGPIPE, dll. Ini jelas kurang.Anda dapat chdir ke dalamnya dan kemudian menghapusnya, asalkan Anda tidak mencoba menggunakan jalur di dalamnya setelah itu:
Saya belum memeriksa, tetapi kemungkinan besar masalah yang sama ketika menggunakan openat (2) di C dengan direktori yang tidak lagi ada di sistem file.
Jika Anda root dan di Linux, Anda bisa bermain dengan namespace yang terpisah, dan
mount -t tmpfs tmpfs /dir
di dalamnya.Jawaban kanonik (setel perangkap pada EXIT) tidak berfungsi jika skrip Anda dipaksa keluar secara tidak bersih (mis. Dengan SIGKILL); yang dapat meninggalkan data sensitif berkeliaran.
Memperbarui:
Berikut ini adalah utilitas kecil yang mengimplementasikan pendekatan namespace. Ini harus dikompilasi dengan
dan diberikan
CAP_SYS_ADMIN
kemampuan file (sebagai root) denganKetika dijalankan (seperti biasa) pengguna sebagai
ia akan berhenti menggunakan namespace filesystem-nya, me-mount sebuah filesystem tmpfs aktif
/proc/sysvipc
, chdir ke dalamnya dan menjalankancommand
dengan argumen yang diberikan. tidakcommand
akan mewarisi kemampuan.CAP_SYS_ADMIN
Sistem file itu tidak akan dapat diakses dari proses lain yang tidak dimulai
command
, dan itu akan secara ajaib menghilang (dengan semua file yang dibuat di dalamnya) kapancommand
dan anak-anaknya mati, tidak peduli bagaimana itu terjadi. Perhatikan bahwa ini hanya unsharing the namespace mount - tidak ada hambatan keras antaracommand
dan proses lain yang dijalankan oleh pengguna yang sama; mereka masih bisa menyelinap ke dalam ruang namanya baik melaluiptrace(2)
,/proc/PID/cwd
atau dengan cara lain.Pembajakan "tidak berguna"
/proc/sysvipc
tentu saja konyol, tetapi alternatifnya adalah spam/tmp
dengan direktori kosong yang harus dihapus atau sangat menyulitkan program kecil ini dengan garpu dan menunggu. Atau,dir
dapat diubah menjadi misalnya./mnt/chtmp
dan membuatnya dibuat oleh root pada saat instalasi; jangan membuatnya bisa dikonfigurasi pengguna dan jangan setel ke jalur yang dimiliki pengguna karena hal itu dapat membuat Anda terkena symlink traps dan hal-hal berbulu lainnya yang tidak layak menghabiskan waktu.chtmp.c
sumber
rm $PWD
kerja, shell masih di dir itu. Tetapi tidak ada file baru yang dapat dimasukkan ke dalam "folder" ini. Yang bisa Anda lakukan hanyalah membaca / menulis dengan file & 3, & 4. Jadi ini masih "file sementara", bukan "folder sementara".Apakah Anda memerlukan shell tertentu?
Jika zsh adalah opsi, harap baca
zshexpn(1)
:Sebagai contoh saya menggunakan ini di rifle (bagian dari manajer file ranger) untuk mendekripsi file dan kemudian menjalankan rifle pada file sementara, yang akan dihapus ketika subproces berakhir. (jangan lupa atur
$TERMCMD
)sumber