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.

Jaymon
sumber

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.

Andrew De Ponte
sumber
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.

Jaymon
sumber
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.

Danila Ladner
sumber
0

Kutipan tunggal.

$ FOO='foo#bar'
$ echo $FOO
foo#bar
Michael Hampton
sumber
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