Di Unix, adakah cara agar satu proses dapat mengubah variabel lingkungan lain (dengan asumsi semuanya dijalankan oleh pengguna yang sama)? Solusi umum adalah yang terbaik, tetapi jika tidak, bagaimana dengan kasus spesifik di mana yang satu adalah anak dari yang lain?
Edit: Bagaimana kalau via gdb?
Jawaban:
Melalui gdb:
Ini adalah peretasan yang cukup buruk dan seharusnya hanya dilakukan dalam konteks skenario debugging, tentunya.
sumber
ptrace: Operation not permitted
Anda mungkin bisa melakukannya secara teknis (lihat jawaban lain), tetapi mungkin tidak membantu Anda.
Sebagian besar program akan mengharapkan bahwa env vars tidak dapat diubah dari luar setelah startup, oleh karena itu kemungkinan besar hanya akan membaca vars yang mereka minati saat startup dan menginisialisasi berdasarkan itu. Jadi mengubahnya setelah itu tidak akan membuat perbedaan, karena program tidak akan pernah membacanya kembali.
Jika Anda memposting ini sebagai masalah konkret, Anda mungkin harus mengambil pendekatan yang berbeda. Jika hanya ingin tahu: Pertanyaan bagus :-).
sumber
Secara substansial, tidak. Jika Anda memiliki cukup hak (root, atau sekitarnya) dan melihat-lihat / dev / kmem (memori kernel), dan Anda membuat perubahan pada lingkungan proses, dan jika proses benar-benar mereferensikan variabel lingkungan sesudahnya (yaitu, proses belum mengambil salinan env var dan tidak hanya menggunakan salinan itu), maka mungkin, jika Anda beruntung dan pintar, dan angin bertiup ke arah yang benar, dan fase bulan benar, mungkin, Anda mungkin mencapai sesuatu.
sumber
gdb
pada proses induk dan diberi skrip untuk melakukan perubahan, dan berfungsi tanpa merusak proses induk. Oke - Anda mungkin bisa melakukannya, tetapi itu bukanlah sesuatu yang akan Anda lakukan secara rutin. Oleh karena itu, untuk tujuan praktis, jawabannya tetap Tidak . Sisa jawaban mencakup alternatif yang tidak mungkin secara teoritis mungkin, alternatif yang agak tidak praktis.Mengutip Jerry Peek:
Satu-satunya hal yang dapat Anda lakukan adalah mengubah variabel lingkungan dari proses anak sebelum memulainya: ia mendapat salinan lingkungan induk, maaf.
Lihat http://www.unix.com.ua/orelly/unix/upt/ch06_02.htm untuk detailnya.
Sekedar komentar untuk jawaban tentang penggunaan / proc. Di bawah linux / proc didukung tetapi, itu tidak berfungsi, Anda tidak dapat mengubah
/proc/${pid}/environ
file, bahkan jika Anda root: itu benar - benar hanya-baca.sumber
Saya bisa memikirkan cara yang agak dibuat-buat untuk melakukan itu, dan itu tidak akan berhasil untuk proses yang sewenang-wenang.
Misalkan Anda menulis perpustakaan bersama Anda sendiri yang mengimplementasikan 'char * getenv'. Kemudian, Anda menyiapkan 'LD_PRELOAD' atau 'LD_LIBRARY_PATH' env. vars sehingga kedua proses Anda dijalankan dengan pustaka bersama yang dimuat sebelumnya.
Dengan cara ini, Anda pada dasarnya akan memiliki kendali atas kode fungsi 'getenv'. Kemudian, Anda bisa melakukan segala macam trik jahat. 'Getenv' Anda dapat melihat file konfigurasi eksternal atau segmen SHM untuk nilai alternatif env vars. Atau Anda bisa melakukan pencarian / ganti regexp pada nilai yang diminta. Atau ...
Saya tidak dapat memikirkan cara mudah untuk melakukannya untuk proses yang berjalan sewenang-wenang (bahkan jika Anda root), singkatnya menulis ulang dynamic linker (ld-linux.so).
sumber
Atau dapatkan proses Anda untuk memperbarui file konfigurasi untuk proses baru dan kemudian:
sumber
Tidak sejauh yang saya tahu. Sungguh Anda mencoba berkomunikasi dari satu proses ke proses lainnya yang memanggil salah satu metode IPC (memori bersama, semaphore, soket, dll.). Setelah menerima data dengan salah satu metode ini, Anda kemudian dapat menetapkan variabel lingkungan atau melakukan tindakan lain secara lebih langsung.
sumber
Jika unix Anda mendukung filesystem / proc, maka mudah untuk MEMBACA env - Anda dapat membaca lingkungan, commandline, dan banyak atribut lain dari proses apa pun yang Anda miliki dengan cara itu. Mengubahnya ... Yah, saya bisa memikirkan cara, tapi itu ide yang BURUK.
Kasus yang lebih umum ... Saya tidak tahu, tapi saya ragu ada jawaban yang bisa dibawa-bawa.
(Diedit: jawaban asli saya mengasumsikan OP ingin MEMBACA env, bukan mengubahnya)
sumber
UNIX penuh dengan komunikasi antar-proses. Periksa apakah instance target Anda memiliki beberapa. Dbus menjadi standar di "desktop" IPC.
Saya mengubah variabel lingkungan di dalam window manager Awesome menggunakan awesome-client dengan adalah "pengirim" kode lua Dbus.
sumber
Bukan jawaban langsung tapi ... Raymond Chen memiliki alasan [berbasis Windows] seputar ini hanya beberapa hari yang lalu : -
Dengan kata lain, fasilitas kernel seperti itu adalah
Namun alasan yang paling mungkin hanyalah bahwa ada kasus penggunaan yang terbatas untuk fasilitas semacam itu.
sumber
Tampaknya putenv tidak berfungsi sekarang, tetapi setenv berfungsi . Saya sedang menguji jawaban yang diterima sambil mencoba mengatur variabel di shell saat ini tanpa hasil
dan varian cara kerjanya:
sumber