Saya punya aplikasi yang membaca file. Sebut saja processname dan file ~ / .configuration . Ketika processname berjalan, ia selalu membaca ~ / .configuration dan tidak dapat dikonfigurasi secara berbeda. Ada juga aplikasi lain yang mengandalkan "~ / .configuration", sebelum dan sesudah, tetapi tidak ketika processname berjalan.
Membungkus processname dalam sebuah skrip yang menggantikan konten ~ / .configuration adalah sebuah pilihan, tetapi saya baru-baru ini mengalami pemadaman listrik (sementara isinya ditukar), di mana saya kehilangan isi file yang sebelumnya dikatakan, jadi ini tidak diinginkan.
Apakah ada cara (mungkin menggunakan sesuatu yang berhubungan dengan jauh LD_DEBUG=files processname
?) Untuk mengelabui proses membaca konten yang berbeda ketika mencoba membaca file tertentu? Mencari dan mengganti nama file di executable agak terlalu invasif, tetapi harus bekerja juga.
Saya tahu mungkin untuk menulis modul kernel yang mengambil alih open()
panggilan ( https://news.ycombinator.com/item?id=2972958 ), tetapi apakah ada cara yang lebih sederhana atau lebih bersih?
EDIT: Ketika mencari ~ / .configuration di executable processname saya menemukan bahwa ia mencoba membaca nama file lain tepat sebelum membaca ~ / .configuration . Masalah terpecahkan.
sumber
LD_PRELOAD
atau SEKERING, seperti dengan masalah yang agak mirip ini , tapi saya tidak tahu implementasi yang ada.Jawaban:
Dalam versi terbaru dari Linux, Anda dapat urungkan yang me-mount namespace . Artinya, Anda dapat memulai proses yang melihat sistem file virtual secara berbeda (dengan sistem file yang dipasang berbeda).
Itu juga bisa dilakukan dengan
chroot
, tetapiunshare
lebih disesuaikan dengan kasus Anda.Seperti
chroot
, Anda perlu superuser yang diprioritaskan keunshare
mount namespace.Jadi, katakan Anda punya
~/.configuration
dan~/.configuration-for-that-cmd
file.Anda dapat memulai proses yang
~/.configuration
sebenarnya merupakan bind-mount~/.configuration-for-that-cmd
di sana, dan jalankanthat-cmd
di sana.Suka:
that-cmd
dan semua proses turunannya akan melihat perbedaan~/.configuration
.that-cmd
di atas akan berjalan sebagairoot
, gunakansudo -u another-user that-cmd
jika perlu dijalankan sebagai pengguna lain .sumber
/test
dan bekerja tanpa masalah.Tautan lunak.
Buat dua file konfigurasi, dan arahkan ke salah satu dari mereka dengan tautan lunak sebagian besar waktu, tetapi ubah tautan lunak untuk menunjuk ke yang lain ketika aplikasi khusus sedang berjalan.
(Saya tahu ini adalah peretasan yang mengerikan, tetapi ini sedikit lebih dapat diandalkan daripada mengubah isi file).
Atau, memanipulasi $ HOME.
Dalam skrip yang memulai proses menjengkelkan, tetapkan $ HOME untuk menjadi sesuatu di bawah direktori $ HOME biasa, dan aplikasi Anda kemudian harus menggunakan file konfigurasi yang terletak di sana (diuji, dan berfungsi untuk perintah shell dasar, ~ diperluas ke $ HOME).
Bergantung pada apa lagi prosesnya, mengubah $ HOME mungkin memiliki konsekuensi yang tidak diinginkan (yaitu file output mungkin berakhir di tempat yang salah).
sumber
Anda dapat melakukan ini menggunakan trik LD_PRELOAD . Berikut ini adalah implementasi yang memetakan jalur yang dimulai dengan awalan spesifik ke lokasi lain. Kode ini juga ada di github .
Misalnya, Anda bisa memalsukan keberadaan file
/etc/
tanpa menjadi root. Ini diperlukan untuk klien owncloud yang menolak untuk bekerja ketika file/etc/ownCloud/sync-exclude.list
tidak ada.Ini bekerja dengan mengesampingkan
open()
danopen64()
fungsi untuk memetakan satu direktori ke direktori lain, misalnya semuaopen()
panggilan untuk/etc/ownCloud/...
dapat dialihkan ke/home/user1/.etc/ownCloud/...
.Cukup sesuaikan
path_map
, lalu kompilasi dan jalankan program Anda dengan lib yang dimuat sebelumnya:Kode sumber
path-mapping.c
:sumber