วิธีตั้งค่าตัวแปรสภาพแวดล้อมทั้งระบบใน OS X Mavericks


36

เราเคยใช้/etc/environmentเพื่อตั้งค่าตัวแปรสภาพแวดล้อมทั้งระบบบน Mountain Lion อย่างไรก็ตามดูเหมือนว่าไฟล์นี้จะไม่อ่านอีกต่อไป

เป็นการดีที่โซลูชันควรใช้กับผู้ใช้ทั้งหมดและเราต้องการให้ทำงานกับเซสชันคอนโซล ssh ดังนั้นเราต้องการสิ่งนี้ในการทำงาน

ssh user@mavericks-machine 'echo $MY_ENV_VAR'

จนถึงตอนนี้เราได้พยายาม:

  • /etc/launchd.conf

    ใช้งานได้กับผู้ใช้ทั้งหมด แต่ใช้กับแอปพลิเคชัน 'ที่มีหน้าต่าง' เท่านั้นเช่นทำงานใน Terminal แต่ไม่ได้อยู่ในเซสชัน ssh

  • ~/.profile, ~/.bash_profileฯลฯ

    ใช้กับหอยเท่านั้น

ข้อเสนอแนะใด ๆ


ไฟล์ ( /etc/environment) ไม่อ่านเนื่องจากไม่ใช่มาตรฐานข้ามระบบ - เป็นเพียงส่วนหนึ่งของเครื่องมืออำนวยความสะดวก Linux PAM Mac OS X ไม่ใช่ Linux และไม่ได้ใช้ PAM หรือไม่ใช้ระบบปฏิบัติการอื่นกับความรู้ของฉัน คุณจะหนีไปเพราะมันอยู่บนลีนุกซ์ และใช่มันยังคงอ่าน - โดย Linux ;-)
1515

คำตอบ:


18

ไฟล์ที่ถูกต้องก่อนที่จะ Mavericks ~/.MacOSX/environment.plistเป็น ไม่รองรับอีกต่อไป

ในดาร์วินและใน Mac OS X สถานที่ที่เหมาะสมในการตั้งค่าเหล่านี้คือ/etc/launchd.confเพื่อใช้กับกระบวนการทั้งหมด หากเกี่ยวข้องกับเชลล์ผู้ใช้โดยเฉพาะให้ใช้ไฟล์เชลล์ที่เหมาะสมแทนขึ้นอยู่กับเชลล์ที่มีปัญหา ดูlaunchd.confและlaunchctlหน้าคนสำหรับข้อมูลเพิ่มเติม

ที่กล่าวว่า ...

หากคุณมีเป้าหมายเพื่อดูการใช้งานเหล่านี้สำหรับเซสชัน ssh โดยเฉพาะคุณต้องระวังว่า ssh เพื่อเหตุผลด้านความปลอดภัยจะไม่ใช้ตัวแปรสภาพแวดล้อมในลักษณะนี้ ในความเป็นจริงแล้วเซสชัน ssh จะได้รับชุดตัวแปรสภาพแวดล้อมที่ จำกัด มากขึ้นจากระบบปฏิบัติการเนื่องจากมันไม่ใช่สิ่งที่เรียกว่าเชลล์ "ล็อกอิน" หรือ "โต้ตอบ" มันจัดเป็นเชลล์ "ที่ไม่ต้องมีการโต้ตอบ" (ดูรายละเอียดman bashเพิ่มเติมเกี่ยวกับประเภทของเชลล์) วิธีที่ ssh จัดการกับตัวแปรสภาพแวดล้อมได้รับการครอบคลุมอย่างดีใน ssh / sshd docs และ man pages

สำหรับ ssh - ซึ่งเป็นเชลล์ของตัวเองคล้ายกับ bash - ตัวแปรสภาวะแวดล้อมสำหรับเซสชันถูกเก็บไว้ใน~/.ssh/environmentรูปแบบที่เทียบเท่ากับการตั้งค่าสำหรับผู้ใช้ต่อหนึ่งคนสำหรับ bash หรือ csh ฯลฯ ในไฟล์เรียกใช้ที่เกี่ยวข้อง นี่อาจเป็นที่ที่คุณต้องการตั้งค่าตัวแปร ENV ของคุณสำหรับเซสชันผู้ใช้ของคุณแม้ว่าคุณจะไม่ได้ระบุรายละเอียดว่าทำไมคุณถึงต้องการกำหนด ENVs ทั่วโลกในโพสต์ดั้งเดิมของคุณซึ่งจะเป็นประโยชน์ในการแก้ปัญหา ฉันขอแนะนำให้คุณตั้งค่าไว้อย่างชัดเจนในแต่ละผู้ใช้ต่อผู้ใช้เพื่อรักษาความปลอดภัยตามบัญชีแต่ละบัญชีตามแนวทางปฏิบัติที่ดีที่สุดของสิทธิ์ / แอตทริบิวต์ที่น้อยที่สุด

หากด้วยเหตุผลบางอย่างที่คุณต้องการเพิกเฉยต่อความปลอดภัยของสิ่งนี้คุณควรตั้งค่าPermitUserEnvironmentใน ssh ของคุณ โปรดทราบว่าสิ่งนี้จะถูกปิดใช้งานหากUseLoginเปิดใช้งาน สำคัญ: ตระหนักดีว่านี่หมายความว่าบัญชีผู้ใช้ที่ตั้งค่าให้ใช้/bin/falseเป็นเชลล์ซึ่งเป็นวิธีการทั่วไปสำหรับการปิดใช้งานบัญชีผู้ใช้ - ในขณะนี้สามารถหลีกเลี่ยงข้อ จำกัด นี้ได้และอาจกลายเป็นใช้งานได้ซึ่งเป็นอันตราย บัญชีจำนวนมากถูกตั้งค่าให้ใช้/bin/falseเป็นเชลล์ซึ่งเป็นความคาดหวังด้านความปลอดภัย

บรรทัดล่างคือคุณไม่ควรทำสิ่งนี้ทั่วโลกและคาดว่า ssh จะเผยแพร่ ENV ด้วยเหตุผลด้านความปลอดภัย คำถามของคุณคือมีประสิทธิภาพจงใจถามว่าจะเอาชนะกลไกต่าง ๆ ที่มีอยู่เพื่อความปลอดภัย


คำตอบที่มีรายละเอียดมาก (+10) ฉันชอบข้อสรุปเช่นกัน :) ยินดีต้อนรับ!
Ruskes

ฉันขอแนะนำว่าด้วยข้อควรระวังความปลอดภัยอาจมีเหตุผลที่ถูกต้องในการทำเช่นนี้ ทุกอย่างขึ้นอยู่กับรูปแบบการคุกคามของคุณ หากคุณกำลังตั้งค่ากลุ่มของเครื่องทดสอบอัตโนมัติมันอาจสมเหตุสมผลในการทำเช่นนี้
uchuugaka

2
ตามstackoverflow.com/a/26311753/1081043 , /etc/launchd.confไม่ทำงานเป็นของ OSX 10.10 โยเซมิตี
wisbucky

10

หากคุณใช้bashงานอยู่การตั้งค่าตัวแปรสภาพแวดล้อม/etc/profileจะมีผลกับผู้ใช้ทุกคน

จากbashคู่มือบน OS X Mavericksด้วยความสำคัญของฉัน (นี่ไม่ได้เปลี่ยนจากรุ่นก่อนหน้า):

เมื่อ bash ถูกเรียกใช้เป็นเชลล์ล็อกอินแบบโต้ตอบหรือเป็นเชลล์ที่ไม่มีการโต้ตอบกับตัวเลือก --login มันจะอ่านและเรียกใช้คำสั่งจากไฟล์ / etc / profile ก่อนหากไฟล์นั้นมีอยู่ หลังจากอ่านไฟล์นั้นจะค้นหา ~ / .bash_profile, ~ / .bash_login และ ~ / .profile ตามลำดับและอ่านและเรียกใช้คำสั่งจากไฟล์แรกที่มีอยู่และอ่านได้
...
ถ้า bash ถูกเรียกด้วยชื่อ sh มันจะพยายามเลียนแบบพฤติกรรมการเริ่มต้นของ sh เวอร์ชั่นที่ใกล้เคียงที่สุดเท่าที่จะเป็นไปได้ในขณะที่สอดคล้องกับมาตรฐาน POSIX เช่นกัน เมื่อเรียกใช้เป็นเชลล์ล็อกอินที่แอ็คทีฟแบบอินเตอร์แอ็คทีฟหรือเชลล์ที่ไม่มีการโต้ตอบที่มีตัวเลือก --login มันจะพยายามอ่านและดำเนินการคำสั่งจาก / etc / profile ก่อน และ ~ / .profile ตามลำดับ


5

สิ่งที่คุณ (และใครก็ตามที่พบคำถามนี้) กำลังมองหาคือเส้นทางต่อไปนี้:

/private/etc/paths

คุณสามารถใส่การแก้ไขของคุณลงใน/private/etc/paths.dถ้าคุณต้องการหลีกเลี่ยงการเปลี่ยนเอกสารการกำหนดค่าเริ่มต้นระบบ "เส้นทาง" หลัก แต่จากนั้นพวกเขาจะถูกผนวกเข้าที่ท้าย$PATHตัวแปรของคุณดังนั้นหากคุณต้องการเพิ่มไดเรกทอรีที่ด้านหน้าของ$PATH(เป็น แทนที่อรรถประโยชน์ของระบบเริ่มต้นตัวอย่างเช่น) คุณจะต้องแก้ไข/private/etc/pathsไฟล์หลักเองและเพิ่มไฟล์เหล่านั้นลงไปด้านบนของรายการ ตัวอย่างเช่นฉันทำสิ่งนี้สำหรับโฟลเดอร์ที่ฉันเก็บสคริปต์จำนวนหนึ่งที่ฉันทำด้วยตัวเองพร้อมกับยูทิลิตีหลักบางอย่างเช่นmozjpegฉันต้องการให้ระบบใช้งานเสมอแทนที่จะเป็นค่าเริ่มต้นที่มาพร้อมกับ (วิธีที่ไฟล์ jpeg ทั้งหมดที่บันทึกไว้โดยโปรแกรมใด ๆ ที่ถูกบีบอัดโดยอัตโนมัติมากถึง 10% มากกว่ายูทิลิตี้ cjpeg ระบบปกติจะบีบอัดพวกเขา - I ' ได้อ่านว่าเหตุผลที่ไม่ได้เป็นค่าเริ่มต้นในระบบส่วนใหญ่เป็นเพราะมันช้าลงมาก แต่เมื่อคุณพูดถึงบางสิ่งบางอย่างเช่น 0.14 วินาทีเมื่อเทียบกับ 0.02 วินาที "ที่ช้าลงโดยปัจจัยที่ 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 Sierra ก็ตามฉันยังได้รับอนุญาตหากฉันพยายามสร้างโดยใช้echoไฟล์ใหม่/private/etc/paths.dที่มีส่วนเพิ่มเติมในพา ธ แต่งานแรกสร้างไฟล์แล้วใช้ที่จะย้ายไฟล์ไปยังsudo mv /private/etc/paths.d
เมอร์เร

สิ่งนี้ช่วยได้ ไดเรกทอรีอื่น ๆ ได้รับการเสริมต่อเส้นทางของฉันแม้จะมีการตั้งค่า $ PATH ในของฉัน~/.zshrc... ผู้ร้ายแน่นอน/private/etc/pathsและฉันต้องอัปเดตไฟล์นี้ ขอบคุณ
nonbeing

1

ฉันมีปัญหาที่คล้ายกันโดยเฉพาะอย่างยิ่ง~/.bashrcไม่ได้รับที่มาเมื่อฉันเชื่อมต่อกับเครื่องของฉันผ่านทาง SSH ฉันพบว่าการเปลี่ยนการตั้งค่าการกำหนดค่าสำหรับ SSHd ทำเคล็ดลับ บางทีปัญหาของคุณยังอยู่กับภูต SSH ด้วย?

แก้ไขไฟล์การกำหนดค่าของบริการ SSH ดังต่อไปนี้:

# /etc/sshd_config
PermitUserEnvironment yes

จากนั้นรีสตาร์ทบริการการเข้าสู่ระบบระยะไกลในการตั้งค่าระบบ> การแชร์

จากsshd_configmanpage:

 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

2
/etc/launchd.confไม่รองรับอีกต่อไปตั้งแต่ OSX 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."

สิ่งที่คุณสามารถทำคือใส่ทุกตัวแปรสภาพแวดล้อมที่คุณต้องการที่จะเป็นโลก-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 syntax ได้ที่https://stackoverflow.com/questions/2710790/how-to-source-a-csh-script-in-bash-to -SET-the-สิ่งแวดล้อมดังนั้นอาจมีบางสิ่งบางอย่างที่สามารถไปในทิศทางอื่นได้

เป็นประสบการณ์ของฉันที่ Mac OS X เคลื่อนไปไกลกว่าและไกลจากพฤติกรรมของไฟล์ rc ที่คาดการณ์ได้ ในฐานะที่เป็นอย่างน้อย 10.8 ก็ไม่น่าที่จะโหลด/etc/rc.common, /etc/rc.confหรือ/etc/rc.<anything>ไม่ (อย่างน้อยตั้งแต่ 10.9) มันจะโหลด/etc/bash.bashrcสำหรับเปลือกหอย nonlogin โต้ตอบ (ซึ่งก็แน่นอนควรจะทำเช่นเดียวกับมันโหลด~/.bashrcสำหรับพวกเขายังคงเป็นของ 10.10) . จากนั้นอีกครั้งฉันมี Fink, MacPorts และ Homebrew ติดตั้งทุกอย่างดังนั้นอาจมีหนึ่งในนั้นกำลังรบกวนพฤติกรรม dotfile เริ่มต้น YMMV


คำถามสำหรับ OS X ก่อนหน้านี้จะมีอื่น ๆ เช่นapple.stackexchange.com/questions/215932/…สำหรับภายหลัง
Mark

โพสต์ของฉันส่งทั้ง Mavericks (10.9) ในบางส่วนและ 10.10 ในบางส่วน หากประเด็นของคุณคือ 10.10 เป็นหัวข้อverbotenทั้งหมดในหัวข้อเกี่ยวกับ 10.9 ฉันไม่แน่ใจว่าทำไมคุณถึงพาฉันไปที่หัวข้อ 10.11 โดยที่ 10.10 จะเป็นหัวข้อนอกเรื่อง (หากกระทู้ที่สงสัยไม่ถูกต้องและ ปิดแล้ว) ฮ่า ๆ.
S. McCandlish
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.