OS X Mavericksでシステム全体の環境変数を設定する方法


36

以前は/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も使用しませんし、他のオペレーティングシステムも私の知る限りでは使用しません。どうやらLinuxを使用しているため、あなたはそれで逃げただけです。そして、はい、それはまだ読まれています
-Linux

回答:


18

Mavericksより前の正しいファイルはでした~/.MacOSX/environment.plist。これはサポートされなくなりました。

Darwinでは、したがってMac OS Xでは、これらを設定する適切な場所は、/etc/launchd.confすべてのプロセスに適用することです。特にユーザーシェルに関連する場合は、問題のシェルに応じて、代わりに適切なシェルファイルを使用します。詳細については、launchd.confおよびlaunchctlmanページを参照してください。

とはいえ...

これらがsshセッションに適用されるのを特に見たい場合は、セキュリティ上の理由からsshがこの方法で環境変数を適用しないことに注意する必要があります。実際、sshセッションは通常、「ログイン」または「対話型」シェルと呼ばれるものではなく、「非対話型」シェルとして分類されるため、OSからより制限的な環境変数のセットを受け取ります。(man bashシェルタイプの詳細については、を参照してください。)sshが環境変数を処理する方法は、ssh / sshdのドキュメントとマニュアルページで詳しく説明されています。

ssh(bashに似た独自のシェル)の場合、セッションの環境変数~/.ssh/environmentは、関連する起動ファイルにbashやcshなどの設定に相当するユーザーごとの環境変数として保存されます。これはおそらく、ユーザーsshセッションのENV変数を設定する場所ですが、元の投稿でENVをグローバルに割り当てる理由を詳しくは説明していませんが、ソリューションを提供するのに役立ちます。最小制限の特権/属性のベストプラクティスに従って、各アカウントに基づいて適切なセキュリティを維持するために、ユーザーごとに明示的に設定することをお勧めします。

何らかの理由でセキュリティの影響を無視したい場合PermitUserEnvironmentは、ssh configで設定してください。UseLoginが有効な場合、これは無効になります。重要:これは、ユーザーアカウントを/bin/falseシェルとして使用するように設定されたユーザーアカウント(ユーザーアカウントを無効にする一般的な方法)がこの制限を回避する可能性があり、アクティブになる可能性があることを意味します。これは危険です。多くのアカウントは/bin/false、セキュリティの期待としてシェルとして使用するように設定されています。

肝心なのは、これをグローバルに行うべきではなく、セキュリティ上の理由からsshがENVを伝播することを期待するべきではないということです。あなたの質問は、事実上、セキュリティ上の理由で存在するいくつかのメカニズムを無効にする方法を意図的に尋ねることです。


非常に詳細な回答(+10)結論も気に入っています:)ようこそ!
ラスケ14年

セキュリティ上の注意を払えば、実際にこれを行う正当な理由があるかもしれません。それはすべて脅威モデルに依存します。テスト自動化マシンのグループをセットアップしている場合、これを行うのが理にかなっているかもしれません。
空中学校

2
stackoverflow.com/a/26311753/1081043によると/etc/launchd.conf、OSX 10.10 Yosemiteでは動作しなくなりました。
ウィスバッキー

10

を使用している場合bash、環境変数の設定は/etc/profileすべてのユーザーに適用されます。

bashOS X Mavericksのマニュアルから、私の重点を置いて(これは以前のバージョンから変更されていません):

bashが対話型ログインシェルとして、または--loginオプションを使用した非対話型シェルとして起動されると、bashは最初にファイル/ etc / profileが存在する場合、ファイルからコマンドを読み取って実行します。そのファイルを読み取った後、〜/ .bash_profile、〜/ .bash_login、および〜/ .profileをこの順序で探し、存在し、読み取り可能な最初のコマンドからコマンドを読み取り、実行します。
...
bashがshという名前で呼び出された場合、POSIX標準にも準拠しながら、shの履歴バージョンの起動時の動作を可能な限り模倣しようとします。対話型の対話型のアクティブなログインシェル、または--loginオプションを指定した非対話型のシェルとして起動すると、最初に/ etc / profileからコマンドを読み取って実行しようとします 〜/ .profileの順で。


5

あなた(およびこの質問を見つけた他の人)がほぼ確実に探しているのは、次のパスです。

/private/etc/paths

/private/etc/paths.dメインシステムのデフォルトの「パス」設定ドキュメントの変更を避けたい場合は、いつでも編集を行うことができますが、$PATH変数の最後に追加されるため、$PATH(の前にディレクトリを追加する場合は、たとえば、デフォルトのシステムユーティリティをオーバーライドする場合は、メイン/private/etc/pathsファイル自体を編集し、リストの先頭に追加するだけです。たとえば、自分で作成したいくつかのスクリプトと、次のようないくつかの主要なユーティリティを格納するフォルダーに対してこれを行います。mozjpeg、システムに付属するデフォルトの代わりに常に使用したい(ほとんどのプログラムで保存されたすべてのjpegファイルが、通常のシステムcjpegユーティリティが圧縮するよりも最大10%自動的に圧縮されるように-私はほとんどのシステムでデフォルトではない理由はずっと遅いからだと読みましたが、0.02秒ではなく0.14秒のような話をしているとき、「7倍遅く」はあまり意味がありませんもちろん、これはサーバーではないと仮定します)。多くの人がおそらくシステムでこれを編集する潜在的な「危険」について警告することを知っていますが、このような答えを探しているなら、おそらくユーティリティの命名に対処するのに十分だと思います将来発生する可能性のある競合、/private/etc/paths本当に可能な限りすべてのユーザー/ログイン/インスタンスにそれらを伝播します-すべてのプログラム、シェルなどは、$PATH変数のベースを構築するためにそのファイル内のパスを使用します。

正直に言うと、ここで誰もまだこれについて言及していないことに私は非常に驚いています。ローンチやSSH固有の使用に関する注意散漫をいじり回すすべて...これは、この基本的な問題を探している人が本当に探しているソリューションです。

ちなみに、OS X /etcでは単にX へのシンボリックリンクに/private/etcなっているので、同じように簡単sudo nano /etc/pathsに同じ場所に移動できます。上記のパスは、ファイルの実際の完全なパスです。


2
何かが足りない場合を除き、システム全体の環境変数を1つだけ設定します- $PATH。OPは一般的な解決策を探しているようです- システム全体の環境変数などを設定します$EDITOR
John N

sudoコマンドを使用しても、macOS Sierraでは、パスへの追加を含むecho新しいファイルを使用して作成しようとすると、許可が拒否され/private/etc/paths.dます。ただし、最初にファイルを作成し、次にを使用sudo mvしてファイルをに移動します/private/etc/paths.d
マレー

これは役に立ちました。$ PATHを設定しているにもかかわらず、他のディレクトリがPATHの先頭に追加されていました~/.zshrc...犯人は実際に/private/etc/pathsあり、このファイルを更新する必要がありました。ありがとう。
不在

1

同様の問題がありました。具体的に~/.bashrcは、SSH経由でマシンに接続したときにソースが取得されていませんでした。SSHdの構成設定を変更するとうまくいくことがわかりました。おそらくあなたの問題はSSHデーモンにもありますか?

SSHサービスの構成ファイルを次のように変更します。

# /etc/sshd_config
PermitUserEnvironment yes

次に、[システム環境設定]> [共有]でリモートログインサービスを再起動します。

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.

(それが役立つ場合、私はこれを自分のwikiでどのようにテストしたかを書きました)


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で使用されなくなりました。
空中学校

2
/etc/launchd.confOSX 10.10 Yosemite
wisbucky

0

うーん... Mac OS X 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.

あなたができることは、あなたがグローバルにしたいすべての環境変数をファイルに入れて、おそらくenvironmentLinuxに合わせて呼び出されるか、(Appleが後でそれを行うことを決定した場合-あなたは決して知らない)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.cshrctcshなど)から取得するか、スクリプトを作成する必要があります。それはそれを自動生成するので、変数を追加/変更するために1つのファイルを編集するだけです。これは、そのようなチュートリアルの場所ではありません。Googleの数秒で、https: //stackoverflow.com/questions/2710790/how-to-source-a-csh-script-in-bash-toで[t] csh変数のエクスポートをbash構文に変換する方法を示しました-環境設定、おそらく他の方向に進むために利用可能なものがあります。

私の経験では、Mac OS Xは予測可能なrcファイルの動作からますます離れています。少なくとも10.8のとおり、それはもはや負荷には思わない/etc/rc.common/etc/rc.confまたは/etc/rc.<anything>それがロードされます(少なくとも10.9以降)、また/etc/bash.bashrc(確かにそれはロードと同じように、やるべきことどのインタラクティブ非ログインシェルのための~/.bashrc10.10のように、まだ、彼らのために) 。それから、Fink、MacPorts、Homebrewのすべてをインストールしているので、そのうちの1つがデフォルトのドットファイルの動作に干渉しているのかもしれません。YMMV。


質問は、以前のOS X向けで、たとえばapple.stackexchange.com/questions/215932/などがあります。後で
…user151019

私の投稿では、Mavericks(10.9)と10.10の両方を取り上げました。あなたのポイントが、10.10が完全に10.9のスレッド内の詳細なトピックである場合、なぜ10.10もオフトピックである10.11スレッドに誘導したのか分かりません(問題のスレッドが無効でなく、とにかく閉じた)。笑。
S. McCandlish
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.