題:
如何在OS X Mavericks上設置系統範圍的環境變量
joerick
2013-10-31 19:41:04 UTC
view on stackexchange narkive permalink

我們曾經使用 / 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讀取;-)
六 答案:
ColonelMode
2014-03-21 03:43:45 UTC
view on stackexchange narkive permalink

在Mavericks之前,正確的文件是〜/ .MacOSX / environment.plist 。不再支持。

在Darwin中,因此在Mac OS X中,正確的設置是在 /etc/launchd.conf 中,以應用於所有進程。如果專門與用戶外殼相關,則根據相關外殼使用適當的外殼文件。有關更多信息,請參見 launchd.conf launchctl 手冊頁。

這就是說...

如果您的目標是明確將其應用於ssh會話,則出於安全原因,您需要知道ssh不適用這樣的環境變量。實際上,ssh會話通常會從OS接收更為嚴格的環境變量集,因為它不是所謂的“登錄”或“交互”外殼,而是被歸類為“非交互”外殼。 (有關shell類型的更多信息,請參見 man bash 。)ssh / sshd文檔和手冊頁中很好地介紹了ssh處理環境變量的方式。

對於ssh(這是它自己的外殼,類似於bash),會話的環境變量存儲在〜/ .ssh / environment 中,作為每用戶等效項在相關的啟動文件中為bash或csh等設置它們。儘管您沒有詳細說明為什麼要在原始帖子中全局分配ENV,這可能是您要為用戶ssh會話設置ENV變量的地方,這將有助於提供解決方案。我建議您根據每位用戶明確地設置它們,以遵循最小限度的特權/屬性最佳實踐,根據每個帳戶分別維護適當的安全性。

如果出於某種原因您希望忽略此問題的安全性,請在ssh配置中設置 PermitUserEnvironment 。請注意,如果啟用了 UseLogin ,此功能將被禁用。重要說明:請注意,這意味著設置為使用 / bin / false 作為其外殼的用戶帳戶-禁用用戶帳戶的典型方法-現在可以解決此限制,並且現在可以激活,是危險的。為了安全起見,許多帳戶都設置為使用 / bin / false 作為其外殼。

最重要的是,您不應該在全局範圍內這樣做,並且出於安全原因,期望ssh傳播ENV。您的問題實際上是有目的地詢問如何打敗出於安全原因而存在的幾種機制。

非常詳細的答案(+10)我也喜歡這個結論:)歡迎光臨!
我建議通過安全警告,確實有這樣做的正確理由。這完全取決於您的威脅模型。如果要設置一組測試自動化機器,則可能需要這樣做。
根據http:// stackoverflow.com / a / 26311753/1081043,`/ etc / launchd.conf`自OSX 10.10 Yosemite起不再起作用。
M K
2013-10-31 23:33:51 UTC
view on stackexchange narkive permalink

如果您正在使用 bash ,則在 / etc / profile 中設置環境變量將適用於所有用戶。

中>我在OS X Mavericks上的 bash 手冊上得到了重點(與以前的版本相同):

當bash作為交互式登錄名被調用時外殼程序,或作為帶有--login選項的非交互式外殼程序,它首先從文件/ etc / profile中讀取並執行命令(如果該文件存在)。讀取該文件後,它將查找〜/ .bash_profile,〜/ .bash_login和〜/ .profile,並從第一個存在且可讀的命令中讀取並執行命令。
...
如果bash為以名稱sh調用時,它會嘗試盡可能緊密地模仿sh的歷史版本的啟動行為,同時也要符合POSIX標準。當作為交互式交互式活動登錄shell或具有--login選項的非交互式shell調用時,它首先嘗試從/ etc / profile 和〜/ .profile中讀取和執行命令。 ,按此順序。

Jordan Smith
2017-03-05 12:20:34 UTC
view on stackexchange narkive permalink

您(以及其他發現此問題的人)幾乎肯定會在尋找以下路徑:

  / private / etc / paths
 

如果您要避免更改主系統默認的“路徑”配置文檔,則始終可以將編輯內容放入 /private/etc/paths.d 中,但隨後會將它們附加到 $ PATH 變量的末尾,因此,如果要在 $ PATH 的開頭添加目錄(例如,覆蓋默認的系統實用程序),則只需要編輯主 / private / etc / paths 文件本身,並將其添加到列表的頂部。例如,我在一個文件夾中執行此操作,在該文件夾中存儲了一些我自己編寫的腳本以及一些關鍵的實用程序,例如 mozjpeg ,我希望系統始終使用該實用程序而不是它帶有默認值(這樣,幾乎任何程序保存的所有jpeg文件都會自動壓縮,比常規系統cjpeg實用程序會壓縮它們多10%-我已經讀過,大多數情況下它不是默認的原因系統是因為它慢得多,但是當您說的是0.14秒而不是0.02秒時,“慢7倍”實際上並沒有什麼意義……假設這不是服務器,當然)。我知道很多人可能會警告在系統中進行深層編輯的潛在“危險”,但是我想說,如果您正在尋找這樣的答案,那麼您可能知道足夠應對任何實用程序命名將來可能發生的衝突,僅在 / private / etc / paths 中進行更改確實會將其傳播到所有可能的用戶/登錄/實例-所有程序,shell等都將使用該文件中的路徑以構建其 $ PATH 變量的基礎。

說實話,我很驚訝這裡沒有其他人提到這一點。所有與SSH特定用途的發布和乾擾有關的事情都令人困惑……這是任何搜索此基本問題的人真正尋找的解決方案-乾淨,直接源源不斷的解決方案。

順便說一句,如果您想知道的話,在OS X上 / etc 只是到 / private / etc 的符號鏈接,因此您可以輕鬆地 sudo nano / etc / paths 並到達相同的確切位置。上面的路徑只是文件的完整實際路徑。

除非我缺少什麼,否則它將只設置一個系統範圍的環境變量-$ PATH。OP似乎正在尋找通用解決方案-在系統範圍內設置* any * env var,例如$ EDITOR等
即使使用`sudo`命令,在macOS Sierra中,如果我嘗試使用`echo`在`/ private / etc / paths.d`中創建一個新文件,但其中包含路徑的添加,我也會獲得拒絕權限。但是它可以先創建文件,然後使用sudo mv將文件移動到/private/etc/paths.d。
這有幫助。儘管在我的〜/ .zshrc中設置了$ PATH,其他目錄也被添加到了我的PATH中……罪魁禍首的確是`/ private / etc / paths`,我不得不更新這個文件。謝謝。
RobM
2014-03-21 00:42:52 UTC
view on stackexchange narkive permalink

我有一個類似的問題,特別是當我通過SSH連接到我的計算機時,沒有找到〜/ .bashrc 。我發現更改SSHd的配置設置可以解決問題。也許您的問題也出在SSH守護程序上?

按如下所示修改SSH服務的配置文件:

 #/ etc / sshd_configPermitUserEnvironment是 

然後在“系統偏好設置”>“共享”中重新啟動“遠程登錄”服務。

sshd_config 聯機幫助頁:

  PermitUserEnvironment指定是否〜/。 ssh / environment和environment =〜/ .ssh / authorized_keys中的選項由sshd(8)處理。默認為``否''。啟用環境處理後,用戶可以使用LD_PRELOAD之類的機制來繞過某些配置中的訪問限制。 

(以防萬一,我已經寫了我如何在個人Wiki

Lri
2014-03-23 05:41:43 UTC
view on stackexchange narkive permalink

如果其他人搜索如何為從常規圖形登錄會話開始的進程設置環境變量,則可以使用 /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不再在啟動時使用。
自OSX 10.10 Yosemite以來不再支持`/ etc / launchd.conf`。
S. McCandlish
2015-11-18 02:06:13 UTC
view on stackexchange narkive permalink

嗯...從Mac OS X 10.10.5或更早版本開始, man -s5 launchd.conf 告訴我們:“ launchd.conf已不再受系統尊重。 “我現在正在進行的工作太多,無法在文件中放置一個虛擬變量,然後重新啟動以查看它是否真的起作用,但是文檔說它不起作用。

man launchctl ,您將看到:“ 不再參考/etc/launchd.conf文件來在早期啟動期間運行子命令;出於安全考慮,已刪除此功能。

可以執行的操作是將要全局化的所有環境變量放入某個文件中,該文件中可能稱為 environment 與Linux保持一致,或者(如果Apple決定以後再做一些事情–您永遠不會知道) environment.conf ,就像我一樣,然後通過 / etc / profile code來獲取>:

  if [-f /etc/environment.conf];然後獲取/etc/environment.conffi 

,或者,如果您更喜歡緊湊格式,則獲取:

  if [-f /etc/environment.conf];然後 。 /etc/environment.conf; fi  

如果使用bash以外的其他shell, 使用與bash相同的變量設置語法(我認為zsh也是如此),則還需要從中獲取該文件Shell的系統範圍的rc文件(例如 / etc / zshrc )。如果您使用的外殼使用不同的語法,例如tcsh,您需要為該shell維護一個類似的文件,並從shell的系統範圍的rc文件中獲取它(例如tcsh的 /etc/csh.cshrc ),或者更好地創建一個自動生成腳本的腳本,因此您只需編輯一個文件即可添加/更改變量。這裡不是本教程的地方;在Google上的幾秒鐘出現瞭如何將[t] csh變量導出轉換為bash語法,網址為 https://stackoverflow.com/questions/2710790/how-to-source-a-csh-script-in- bash設置環境,所以可能還有其他方向可用。

我的經驗是,Mac OS X越來越遠離可預測的rc文件行為。從至少10.8開始,它似乎不再加載 /etc/rc.common /etc/rc.conf /etc/rc.<anything> ,也不會(至少從10.9起)不會為交互式非登錄shell加載 /etc/bash.bashrc (它肯定會這樣做,就像它加載〜/ .bashrc一樣) (直到10.10)。然後我又重新安裝了Fink,MacPorts和Homebrew,所以也許其中之一正在干擾默認的dotfile行為。 YMMV。

問題是對於較早的OS X,會有其他例如http://apple.stackexchange.com/questions/215932/setting-system-wide-environment-variables-in-el-capitan?noredirect=1#comment261117_215932,以備後用
我的帖子部分針對小牛(10.9)和10.10。如果您的意思是10.10完全是關於10.9的主題中的一個_verboten_主題,那麼我不確定為什麼您將我定向到10.11主題,其中10.10也將成為主題(如果有問題的主題不是無效主題,並且仍然關閉)。大聲笑。


該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...