OS X Mavericks에서 시스템 전체 환경 변수를 설정하는 방법


32

우리는 /etc/environment Mountain Lion에서 시스템 전체 환경 변수를 설정하는 방법 그러나이 파일은 더 이상 읽지 않습니다.

이상적으로 솔루션은 모든 사용자에게 적용되어야하며, 우리는 ssh 콘솔 세션에서 작동해야합니다. 그래서 우리는이 작업이 필요합니다.

ssh user@mavericks-machine 'echo $MY_ENV_VAR'

지금까지 우리가 시도한 것은 :

  • /etc/launchd.conf

    모든 사용자에게 적용되지만 '창'된 응용 프로그램, 즉 터미널에서 작동하지만 SSH 세션에서는 작동하지 않는 응용 프로그램에만 적용됩니다.

  • ~/.profile, ~/.bash_profile 기타

    셸에만 적용됩니다.

어떤 제안?


파일 ( /etc/environment )는 시스템 간 표준이 아니기 때문에 읽히지 않습니다. 이것은 Linux PAM 기능의 일부일뿐입니다. Mac OS X은 Linux가 아니며 PAM을 사용하지 않으며 다른 운영 체제를 사용하지도 않습니다. 당신이 리눅스를 사용하고 있었기 때문에 당신은 그걸 가지고 떠났습니다. 그리고 예, 그것은 여전히 ​​읽혀집니다 - 리눅스에 의해 ;-)
amn

답변:


15

Mavericks 이전의 올바른 파일은 다음과 같습니다. ~/.MacOSX/environment.plist. 더 이상 지원되지 않습니다.

Darwin과 Mac OS X에서 이러한 설정을위한 적절한 장소는 다음과 같습니다. /etc/launchd.conf 모든 프로세스에 적용; 특히 사용자 셸과 관련이 있다면 해당 셸에 따라 적절한 셸 파일을 대신 사용하십시오. 자세한 내용은 launchd.conflaunchctl 자세한 내용은 man 페이지.

그건 ...

목표를 세우려면 특히 ssh 세션에 적용되는 것을 보려면 보안상의 이유로 ssh가 이러한 방식으로 환경 변수를 적용하지 않는다는 사실을 알아야합니다. 실제로 ssh 세션은 일반적으로 "로그인"또는 "대화식"쉘로 알려진 것이 아니기 때문에 운영 체제에서 훨씬 더 제한적인 환경 변수 집합을받습니다.이 쉘은 "비대화 형"쉘로 분류됩니다. (만나다 man bash ssh가 환경 변수를 다루는 방법은 ssh / sshd 문서와 맨 페이지에 잘 설명되어있다.

ssh - 자신의 쉘인, 세션에 대한 bash - environment 변수와 유사 함 ~/.ssh/environment 사용자별로 bash 또는 csh 등 관련 런치 파일에 설정하는 것과 동일합니다. 이것은 주로 사용자 ssh 세션에 ENV 변수를 설정하려는 경우이지만 솔루션을 제공하는 데 유용한 ENV를 원래 게시물에 전체적으로 할당하려는 이유를 자세히 설명하지는 않습니다. 가장 제한이 적은 특권 / 속성 우수 사례에 따라 각 계정별로 적절한 보안을 유지하기 위해 사용자별로 사용자별로 명시 적으로 설정하는 것이 좋습니다.

어떤 이유로 보안 위협을 무시하기를 원한다면 PermitUserEnvironment ssh configs에서. 이 옵션은 UseLogin 사용 가능. 중요 : 이것은 사용자 계정이 사용하도록 설정되었음을 의미합니다. /bin/false 이제는 사용자 계정을 비활성화하는 일반적인 방법 인 쉘이이 제한을 피해 잠재적으로 활동적으로 될 수 있으므로 위험합니다. 많은 계정이 사용하도록 설정되었습니다. /bin/false 보안 기대치로서 그들의 껍질로.

결론적으로 말하자면이 작업은 전 세계적으로 수행되어서는 안되며 보안상의 이유로 ssh가 ENV를 전파 할 것으로 예상해야합니다. 귀하의 질문은 보안상의 이유로 존재하는 몇 가지 메커니즘을 무력화시키는 방법을 고의적으로 요구하고 있습니다.


매우 상세한 답변 (+10) 나는 결론도 좋아한다 :) 환영!
Buscar웃

보안 문제로 인해 실제로이를 수행 할 타당한 이유가 있음을 제안합니다. 그것은 모두 귀하의 위협 모델에 따라 다릅니다. 테스트 자동화 시스템 그룹을 설정하는 경우이를 수행하는 것이 좋습니다.
uchuugaka

2
에 따르면 stackoverflow.com/a/26311753/1081043 , /etc/launchd.conf OSX 10.10 Yosemite에서 더 이상 작동하지 않습니다.
wisbucky

8

사용중인 경우 bash, 환경 변수를 다음과 같이 설정하십시오. /etc/profile 모든 사용자에게 적용됩니다.

로부터 bash OS X Mavericks의 매뉴얼 , 내 강조 (이것은 이전 버전에서 변경되지 않았습니다) :

bash가 대화식 로그인 쉘 또는 --login 옵션과 함께 비대화 형 쉘로 호출 될 때, / etc / profile 파일에서 명령을 읽고 실행합니다. 이 파일을 읽은 후 ~ / .bash_profile, ~ / .bash_login 및 ~ / .profile을이 순서로 검색하고 존재하고 읽을 수있는 첫 번째 명령을 읽고 실행합니다.
...
bash가 sh라는 이름으로 호출되면 sh의 히스토리 버전의 시작 동작을 가능한 한 가깝게 모방하려고 시도하지만, POSIX 표준에도 부합합니다. 인터 액티브 대화 형 활성 로그인 쉘 또는 --login 옵션과 함께 비 대화식 쉘로 호출 될 경우, 먼저 / etc / profile에서 명령을 읽고 실행하려고 시도합니다. ~ / .profile을 순서대로 사용하십시오.


4

당신 (그리고이 질문을 찾는 다른 누구)이 거의 확실하게 찾고있는 경로는 다음과 같습니다.

/private/etc/paths

수정 사항을 언제든지 /private/etc/paths.d 기본 시스템의 "경로"구성 문서를 변경하지 않으려는 경우에는 해당 경로의 끝에 추가됩니다. $PATH 변수이므로 앞에 디렉토리를 추가하려면 $PATH (예를 들어 기본 시스템 유틸리티를 덮어 쓰려면) main /private/etc/paths 파일 자체를 만들고 목록 맨 위에 추가하십시오. 예를 들어, 필자가 만든 스크립트를 몇 개 저장 한 폴더와 다음과 같은 몇 가지 주요 유틸리티와 함께이 작업을 수행합니다. mozjpeg, 그 시스템은 항상 함께 제공되는 기본값 대신 사용하는 (그런 식으로 거의 모든 프로그램에 의해 저장되는 모든 jpeg 파일을 자동으로 정상 시스템 cjpeg 유틸리티를 압축하는 것보다 최대 10 % 대부분의 시스템에서 기본값이 아니라는 이유는 속도가 훨씬 느리기 때문입니다. 그러나 0.02 초가 아니라 0.14 초와 같은 것을 말할 때 "느린 7 배"는 실제로 많은 것을 의미하지 않습니다 무엇이든 ... 이것은 물론 서버가 아니라고 가정). 나는 많은 사람들이 아마이 시스템을 깊이있게 편집 할 수있는 잠재적 인 "위험"에 대해 경고 할 것이지만, 만약 당신이 이와 같은 대답을 찾고 있다면, 당신은 아마도 어떤 유틸리티 네이밍 미래에 잠재적으로 발생할 수있는 갈등을 /private/etc/paths 가능한 모든 사용자 / 로그인 / 인스턴스로 전파합니다. 모든 프로그램, 쉘 등은 해당 파일의 경로를 사용하여 $PATH 변하기 쉬운.

솔직히 말해서, 나는 여기 아직 아무도 이것을 언급하지 않았다. SSH에 특화된 용도에 관한 발사 및 산만 함으로 뒤죽박죽 된 모든 것 ... 이것은 근본적인 문제를 찾는 모든 사람이 실제로 찾고있는 솔루션입니다. 깨끗하고 직선적 인 소스, 항상 작동하는 솔루션입니다.

그건 그렇고, 당신이 궁금해하는 경우에, OS X에서 /etc 단순히 심볼릭 링크입니다. /private/etc, 그렇게 쉽게 할 수 있습니다. sudo nano /etc/paths 똑같은 장소에 도착하십시오. 위의 경로는 파일의 완전한 실제 경로입니다.


2
뭔가를 놓치지 않는 한, 시스템 전체 환경 변수를 하나만 설정합니다. $PATH. OP는 일반 솔루션을 찾고있는 것 같습니다. 어떤 env var, 시스템 전체 (예 : $EDITOR
John N

심지어 sudo 명령, macOS 시에라, 내가 만들려고하면 권한이 거부된다. echo ~에있는 새 파일 /private/etc/paths.d 경로에 추가가 포함됩니다. 하지만 먼저 파일을 만든 다음 sudo mv 파일을로 이동하려면 /private/etc/paths.d.
murray

1

나는 비슷한 문제를 겪었다. ~/.bashrc SSH를 통해 내 컴퓨터에 연결할 때 출처가 밝혀지지 않았습니다. SSHd의 구성 설정을 변경하는 것이 트릭을 찾았다. 아마도 당신의 문제는 SSH 데몬과 관련이 있습니까?

다음과 같이 SSH 서비스의 구성 파일을 수정하십시오.

# /etc/sshd_config
PermitUserEnvironment yes

그런 다음 시스템 환경 설정 & gt; 나누는.

로부터 sshd_config 맨 페이지 :

 PermitUserEnvironment
         Specifies whether ~/.ssh/environment and environment= options in
         ~/.ssh/authorized_keys are processed by sshd(8).  The default is
         ``no''.  Enabling environment processing may enable users to
         bypass access restrictions in some configurations using mecha-
         nisms such as LD_PRELOAD.

(도움이 될 경우, 필자가 테스트 한 내용을 개인 위키 )


1

다른 사람들이 일반적인 그래픽 로그인 세션에서 시작된 프로세스에 환경 변수를 설정하는 방법을 찾으면 다음을 사용할 수 있습니다. /etc/launchd.conf. 예를 들어 다음을 추가합니다. /usr/local/bin 기본 경로로 이동

echo setenv PATH /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin|sudo tee -a /etc/launchd.conf

변경 사항을 적용하려면 다시 시작하십시오. 변경 사항을 적용하는 또 다른 방법은 실행하는 것입니다. launchctl</etc/launchd.conf;sudo launchctl</etc/launchd.conf 프로세스를 다시 시작합니다.


/etc/launchd.conf는 launchd에서 더 이상 사용되지 않습니다.
uchuugaka

1
/etc/launchd.conf OSX 10.10 Yosemite 이후 더 이상 지원되지 않습니다.
wisbucky

0

흠 ... 맥 오에스텐 10.10.5와 아마 이전 버전에서, man -s5 launchd.conf 우리에게 말해: " launchd.conf is no longer respected by the system. "더미 변수를 파일에 넣고 실제로 다시 작동하는지 여부를 확인하기 위해 재시작하는 작업이 너무 많습니다.하지만 설명서에는 작동하지 않아야한다고 나와 있습니다.

나는 그렇지 않을 것이라고 확신한다. 해야 할 것 man launchctl 그러면 다음과 같이 표시됩니다. " The /etc/launchd.conf file is no longer consulted for subcommands to run during early boot time; this functionality was removed for security considerations. "

너 뭐야? 양철통 do는 당신이 global-ish가되기를 원하는 모든 환경 변수를 어떤 파일에 넣는다. environment 리눅스에 맞춰서, 또는 (애플이 나중에 그걸로 무엇인가를하기로 결정한 경우에 - 결코 알지 못한다) environment.conf, 내가했던 것처럼, 다음을 통해 이것을 제공합니다. /etc/profile:

if [ -f /etc/environment.conf ]; then
   source /etc/environment.conf
fi

또는 소형 형식을 선호하는 경우

if [ -f /etc/environment.conf ]; then . /etc/environment.conf; fi

bash 이외의 쉘을 사용한다면, 그것은 bash와 같은 변수 설정 구문을 사용합니다 (zsh과 마찬가지로), 쉘의 시스템 전체 rc 파일에서이 파일을 소스해야합니다. /etc/zshrc ). 다른 구문을 사용하는 셸을 사용하는 경우 (예 : tcsh를 실행하려면 쉘과 비슷한 파일을 유지하고 쉘의 시스템 전체의 rc 파일 (예. /etc/csh.cshrc tcsh의 경우) 또는 자동 생성 스크립트를 만드는 것이 더 좋으므로 하나의 파일을 편집하여 변수를 추가 / 변경해야합니다. 이것은 자습서를위한 장소가 아닙니다. Google에서 몇 초가 [t] csh 변수 내보내기를 bash 구문으로 변환하는 방법을 나타 냈습니다. https://stackoverflow.com/questions/2710790/how-to-source-a-csh-script-in-bash-to-set-the-en viroment , 아마도 다른 방향으로 나아갈 수있는 것이있을 것입니다.

Mac OS X이 예측 가능한 rc 파일 동작에서 멀어지고 있습니다. 적어도 10.8부터 더 이상로드하지 않는 것 같습니다. /etc/rc.common, /etc/rc.conf 또는 /etc/rc.<anything>, (최소 10.9 이후)로드되지 않습니다. /etc/bash.bashrc 대화 형 비 로그인 셸 (이것은 확실히로드해야합니다.) ~/.bashrc 10.10 현재). 그런 다음 다시 Fink, MacPorts 및 Homebrew에서 모든 설치 작업을 수행하므로 어쩌면 그 중 하나가 기본 dotfile 동작을 방해합니다. YMMV.


이전 OS X에 대한 질문은 예를 들어 다른 것입니다. apple.stackexchange.com/questions/215932/... 나중에
Mark

내 게시물은 부분적으로 모두 매버릭스 (10.9)와 부분적으로 10.10을 다뤘습니다. 귀하의 요점은 10.10은 버르 보텐 10.9에 관한 스레드에서 전체적으로 주제가 있는데 왜 10.11 스레드로 나를 안내했는지는 모르겠다. 문제의 스레드가 유효하지 않았고 어쨌든 닫혀 있으면 10.10도 주제가 아닐 수 있습니다. LOL.
S. McCandlish
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.