LD_LIBRARY_PATH tidak disetel oleh layar

13

Berjalan screendi bash menghapus variabel LD_LIBRARY_PATH. Saya sudah melakukan beberapa bacaan dan sepertinya ini perilaku yang diharapkan, tetapi saya perlu menyiasatinya.

Solusinya adalah menambahkan deklarasi LD_LIBRARY_PATH ke ~/.bashrc. Dalam kasus saya, LD_LIBRARY_PATH akan banyak berubah antara peluncuran shell dan ketika aku memanggil layar, jadi saya perlu untuk mendapatkan saat ini nilai LD_LIBRARY_PATH ke screensesi.

Andrew Wood
sumber
Anda telah mengekspor LD_KLIBRARY_PATH sebelum menjalankan layar?
kinnou02
Pertanyaan pengguna super.
karlphillip
Maaf, bisakah saya memindahkannya entah bagaimana, atau haruskah saya menghapus dan memposting ulang?
Jika Anda mendapatkan lima suara dekat, itu akan bertemu di sana secara otomatis. Tinggal satu lagi!
Thomas

Jawaban:

14

screentidak menghapus variabel lingkungan; itu dihapus oleh Linux itu sendiri.

Pada kebanyakan sistem, /usr/bin/screenexecutable diinstal dengan bit setgid untuk utmpgrup, agar dapat memodifikasi utmpdatabase. Ini juga menggunakan setgid untuk mengontrol akses ke direktori socket ( /var/run/screen/).

Di Linux, ketika program setuid (atau setgid ) dijalankan, ia tidak menerima variabel lingkungan tertentu (termasuk LD_LIBRARY_PATH, beberapa LD_*variabel lain , dan HOSTALIASES), untuk mengurangi kemungkinan titik serangan: Jika tidak, Anda bisa menulis perpustakaan kecil dan trik suatau sudountuk memanggil fungsi "ditingkatkan" Anda dengan cara itu.


Anda dapat menghapus bit setgid dari screen, tetapi Anda harus membuat direktori socket sepenuhnya dapat diakses oleh semua orang (mode 0777). Namun, itu seharusnya tidak menjadi risiko keamanan, seperti screenjuga memeriksa UID sang guru itu sendiri.

Namun, Anda tidak harus membuat utmpdatabase bisa ditulis oleh dunia.

pengguna1686
sumber
(Catatan: Saya tidak yakin apakah variabel lingkungan dihapus oleh kernel, atau oleh ld-linux.so, atau dengan runtime glibc.)
user1686
Bekerja sangat baik. Ini adalah perintah yang perlu dilakukan: chgrp root $(which screen)dan chmod 777 /var/run/screen. Anda dapat menguji dengan skrip bash kecil ini: while true; do echo $LD_LIBRARY_PATH; sleep 2; done Anda akan melihat bahwa path berhasil ditampilkan. Terima kasih grawity.
lepe
7

Di Anda .screenrc, Anda dapat menggunakan setenvperintah untuk menetapkan nilai di lingkungan layar.

setenv LD_LIBRARY_PATH $LD_LIBRARY_PATH_SCREEN

Ini diatur sebelum shell Anda dimulai. Jelas LD_LIBRARY_PATH_SCREENperlu diatur sebelum Anda memulai layar.

Droj
sumber
1
Lihat jawaban grawity - LD_LIBRARY_PATH adalah variabel khusus dalam konteks ini. Bahkan jika ini berhasil (setenv tidak perlu '=', btw) itu tidak akan sangat membantu untuk mengubah nama variabel lingkungan yang kita coba atur; program masih akan melihat nama kanonik (lihat stackoverflow.com/questions/13974069/… ).
Andrew Wood
Than untuk koreksi. Saya memperbaiki sintaks dan lupa bahwa saya memiliki variabel berbeda di layar mulai lingkungan. Yang _SCREENdapat diatur dalam file rc Anda atau dalam skrip wrapper yang memulai layar.
Droj
1

Cobalah exportvariabel lingkungan yang Anda minati.

export LD_LIBRARY_PATH
Benjamin Bannier
sumber