Variabel lingkungan di / etc / environment dengan pound (hash) isikan nilainya


10

Di Ubuntu 12.04, saya memiliki variabel lingkungan yang didefinisikan /etc/environmentseperti ini:

FOO="value_before#value_after"

Ketika saya ssh ke server untuk memeriksa nilainya, saya mendapatkan ini:

$ env | grep FOO
FOO=value_before

Saya menduga itu memperlakukan #sebagai komentar dan menghapusnya, namun, ini berfungsi:

$ . /etc/environment
$ export FOO
$ env | grep FOO
FOO=value_before#value_after

Saya sudah mencoba melarikan diri #seperti ini:

FOO="value_before\#value_after"

Tapi itu tidak berhasil, sebagai gantinya saya hanya mendapatkan ini:

FOO=value_before\

Adakah ide tentang bagaimana membuat hash diperlakukan seperti bagian dari nilai? Bantuan apa pun akan bagus.

Nilai yang saya coba dalam /etc/environmentfile:

FOO='value_before#value_after'
FOO="value_before#value_after"
FOO='"value_before#value_after"'
FOO="value_before\#value_after"
FOO='value_before\#value_after'

Dan berbagai kombinasi lainnya di atas. Banyak dari ini akan bekerja ketika Anda biasanya meletakkannya di shell. Tetapi mereka tampaknya tidak berfungsi dalam /etc/environmentfile.

Jawaban:


5

Ini dibaca oleh modul pam_env. Mengingat bahwa modul pam_env mengharapkannya menjadi "sederhana" KEY = VALUE pair (tidak perlu tanda kutip) dan juga mendukung komentar yang diidentifikasi oleh #, itu mengasumsikan bahwa # dan apa pun yang mengikutinya dalam VALUE adalah komentar. Juga, perhatikan bahwa itu tidak mendukung konsep pelarian.

Ini dapat dilihat pada cuplikan berikut dari fungsi _parse_env_file di pam_env.c .

/* now find the end of value */
mark = key;
while(mark[0] != '\n' && mark[0] != '#' && mark[0] != '\0')
    mark++;
if (mark[0] != '\0')
    mark[0] = '\0';

Cuplikan di atas berjalan setiap karakter bagian VALUE sampai menemukan \n,, #atau \0. Kemudian menimpa karakter itu dengan a \0.

Ini secara efektif menghapus #dan semua yang mengikuti. Catatan: Ini adalah fitur bukan bug. Ini adalah fitur komentar.

Jadi, pada titik ini Anda tidak dapat memiliki nilai /etc/environmentyang menyertakan a #atau a \natau \0di tengah nilai. Itu juga terlihat dari kode bahwa kunci harus alfa-numerik.


Wah, paku itu! Terima kasih atas penjelasan terperinci, saya telah menandai ini sebagai solusi yang diterima.
Jaymon

3

Saya tidak pernah dapat menemukan cara mengatasi keterbatasan ini /etc/environment, dokumentasi tampaknya menyatakan bahwa itu /etc/environmentadalah file lingkungan yang sederhana :

This module can also parse a file with simple KEY=VAL pairs on separate 
lines (/etc/environment by default).

Yang mungkin berarti itu tidak akan membiarkan Anda melarikan diri dari nilai menggunakan tanda kutip atau \karakter, meskipun tempat lain dalam dokumentasi mungkin mengatakan ini mungkin :

(Possibly non-existent) environment variables may be used in values using 
the ${string} syntax and (possibly non-existent) PAM_ITEMs may be used in 
values using the @{string} syntax. Both the $ and @ characters can be 
backslash escaped to be used as literal values values can be delimited with ""

Atau mungkin tidak :

The file is made up of a list of rules, each rule is typically placed on a
single line, [...] Comments are preceded with `#´ marks and extend to the 
next end of line.

Bagaimanapun, untuk mengatasi batasan ini, saya memindahkan variabel lingkungan global saya ke dalam file /etc/profile.dseperti yang dibahas dalam jawaban ini . Saya masih menganggap pertanyaan ini belum terjawab, tetapi saya ingin memastikan ada solusi terkait untuk anak cucu.


1

Tidak ada cara di / etc / environment untuk keluar dari # (sebagaimana diperlakukan sebagai komentar) karena sedang diuraikan oleh modul PAM "pam_env" dan itu memperlakukannya sebagai daftar sederhana pasangan KEY = VAL dan mengatur lingkungan yang sesuai. Ini bukan bash / shell, parser tidak memiliki bahasa untuk melakukan ekspansi variabel atau karakter melarikan diri.


0

Kutipan tunggal.

$ FOO='foo#bar'
$ echo $FOO
foo#bar

1
Itu adalah salah satu nilai pertama yang saya coba, sementara itu bekerja di shell, sayangnya, itu tidak berhasil /etc/environment, saya memperbarui pertanyaan saya dengan beberapa contoh nilai yang saya coba.
Jaymon
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.