Biến môi trường trong / etc / môi trường có dấu thăng (băm) trong giá trị


10

Trên Ubuntu 12.04, tôi có một biến môi trường được định nghĩa /etc/environmentnhư sau:

FOO="value_before#value_after"

Khi tôi ssh vào máy chủ để kiểm tra giá trị, tôi nhận được điều này:

$ env | grep FOO
FOO=value_before

Tôi đoán nó đang coi nó #như một bình luận và tước nó ra, tuy nhiên, điều này hoạt động:

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

Tôi đã thử thoát #như thế này:

FOO="value_before\#value_after"

Nhưng điều đó không hiệu quả, thay vào đó tôi chỉ nhận được điều này:

FOO=value_before\

Bất kỳ ý tưởng về cách làm cho băm được coi là một phần của giá trị? Bất kỳ sự trợ giúp nào đều sẽ là tuyệt vời.

Các giá trị tôi đã thử trong /etc/environmenttệp:

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'

Và sự kết hợp khác nhau của ở trên. Rất nhiều trong số này sẽ hoạt động khi bạn thường đặt chúng trong vỏ. Nhưng họ dường như không làm việc trong /etc/environmenttập tin.

Câu trả lời:


5

Điều này được đọc bởi mô-đun pam_env. Cho rằng mô-đun pam_env hy vọng chúng là các cặp KEY = VALUE "đơn giản" (không cần dấu ngoặc kép) và cũng hỗ trợ các nhận xét được xác định bởi #, nó giả sử rằng # và bất cứ điều gì theo sau trong GIÁ TRỊ đều là nhận xét. Ngoài ra, lưu ý rằng nó không hỗ trợ bất kỳ khái niệm thoát.

Điều này có thể được nhìn thấy trong đoạn trích sau từ hàm _parse_env_file trong 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';

Đoạn mã trên đi từng ký tự của phần GIÁ TRỊ cho đến khi tìm thấy một \n, #hoặc \0. Sau đó, nó ghi đè lên nhân vật đó với a \0.

Điều này có hiệu quả tước bỏ #và tất cả mọi thứ sau đây. Lưu ý: Đây là một tính năng không phải là một lỗi. Đây là tính năng bình luận.

Vì vậy, tại thời điểm này, bạn không thể có các giá trị /etc/environmentbao gồm a #hoặc a \nhoặc \0ở giữa giá trị. Cũng giống như mã mà các khóa cần phải là số alpha.


Whoa, đóng đinh nó! Cảm ơn đã giải thích chi tiết, tôi đã đánh dấu đây là giải pháp được chấp nhận.
Jaymon

3

Tôi không bao giờ có thể tìm ra cách khắc phục giới hạn này /etc/environment, tài liệu dường như nói rằng đó /etc/environmentlà một tệp môi trường đơn giản :

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

Điều đó có nghĩa là nó sẽ không cho phép bạn thoát khỏi các giá trị bằng cách sử dụng dấu ngoặc kép hoặc \ký tự, mặc dù các vị trí khác trong tài liệu có thể nói điều này là có thể :

(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 ""

Hoặc có thể không :

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.

Dù sao, để vượt qua giới hạn này, tôi đã chuyển các biến môi trường toàn cầu của mình thành một tệp /etc/profile.dnhư được thảo luận trong câu trả lời này . Tôi vẫn xem xét câu hỏi này chưa được trả lời, nhưng tôi muốn chắc chắn rằng có một cách giải quyết liên kết cho hậu thế.


1

Không có cách nào trong / etc / môi trường để thoát # (vì nó được coi là một nhận xét) vì nó được phân tích cú pháp bởi mô-đun PAM "pam_env" và nó coi nó như một danh sách đơn giản các cặp KEY = VAL và thiết lập môi trường phù hợp. Nó không phải là bash / shell, trình phân tích cú pháp không có ngôn ngữ để thực hiện mở rộng biến hoặc các ký tự thoát.


0

Dấu nháy đơn.

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

1
Đó là một trong những giá trị đầu tiên tôi đã thử, trong khi nó hoạt động trong vỏ, thật đáng buồn, nó không hoạt động /etc/environment, tôi đã cập nhật câu hỏi của mình với một số ví dụ về các giá trị tôi đã thử.
Jaymon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.