값에 파운드 (해시) 기호가있는 / etc / environment의 환경 변수


10

우분투 12.04에는 다음과 /etc/environment같이 정의 된 환경 변수가 있습니다 .

FOO="value_before#value_after"

값을 확인하기 위해 서버에 ssh하면 다음과 같이 나타납니다.

$ env | grep FOO
FOO=value_before

나는 그것이 #주석으로 취급하고 그것을 제거하는 것으로 추측 하지만, 이것은 효과가 있습니다.

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

나는 다음 #과 같이 탈출하려고 시도했다 .

FOO="value_before\#value_after"

그러나 그것은 작동하지 않습니다, 대신 나는 이것을 얻습니다 :

FOO=value_before\

해시를 가치의 일부로 취급하는 방법에 대한 아이디어가 있습니까? 어떤 도움이라도 좋을 것입니다.

/etc/environment파일 에서 시도한 값 :

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'

그리고 위의 다른 다양한 조합. 쉘에서 정상적으로 설정하면 많은 것들이 작동합니다. 그러나 그들은 /etc/environment파일 에서 작동하지 않는 것 같습니다 .

답변:


5

pam_env 모듈에서 읽습니다. pam_env 모듈은 "간단한"KEY = VALUE 쌍 (따옴표가 필요하지 않음)을 기대하고 #로 식별 된 주석도 지원한다는 점을 고려할 때 #과 VALUE에서 그 뒤에 오는 것은 주석이라고 가정합니다. 또한 이스케이프 개념을 지원하지 않습니다.

이것은에서 _parse_env_file 함수의 다음 코드에서 볼 수 있습니다 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';

상기 단편은 그것이 발견 될 때까지 VALUE 부의 각 문자 안내 \n, #또는 \0. 그런 다음 해당 문자를로 덮어 씁니다 \0.

이것은 효과적으로 #모든 것을 제거합니다 . 참고 : 이 기능입니다 하지 버그. 댓글 기능입니다.

따라서이 시점에서 값이 /etc/environmenta #또는 a \n또는 \0중간에있는 값을 가질 수 없습니다 . 또한 코드에서 키가 영숫자 여야하는 것처럼 보입니다.


우와, 못을 박았다! 자세한 설명을 주셔서 감사합니다. 이것을 승인 된 솔루션으로 표시했습니다.
Jaymon

3

에서이 제한을 피할 수있는 방법을 찾지 못했습니다 /etc/environment. 문서 /etc/environment간단한 환경 파일 이라고 말합니다 .

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

문서의\ 다른 위치에서도 가능하다고 말 하더라도 따옴표 또는 문자를 사용하여 값을 이스케이프하지 못하게 할 수 있습니다 .

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

아니면 아닐 수도 있습니다 .

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.

어쨌든,이 한계를 극복하기 위해이 답변에서 논의 된/etc/profile.d 것처럼 전역 환경 변수를 파일로 옮겼습니다 . 나는 여전히이 질문에 답이 없다고 생각하지만 후손에 대한 해결 방법이 있는지 확인하고 싶었습니다.


1

PAM 모듈 "pam_env"에 의해 구문 분석 될 때 / etc / environment에서 # (주석으로 취급되는)을 이스케이프 처리 할 방법이 없으며이를 KEY = VAL 쌍의 간단한 목록으로 취급하고 설정합니다. 환경. bash / shell이 ​​아니며 파서에는 변수 확장 또는 문자 이스케이프를 수행 할 언어가 없습니다.


0

작은 따옴표.

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

1
그것은 내가 시도한 첫 번째 값 중 하나였습니다. 쉘에서 작동하지만 슬프게도 작동하지 않습니다 /etc/environment. 내가 시도한 값의 예로 내 질문을 업데이트했습니다.
Jaymon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.