จะทราบได้อย่างไรว่าตัวแปรสภาพแวดล้อมมาจากที่ใด


153

ฉันมีอินสแตนซ์ลินุกซ์ที่ฉันตั้งค่าบางเวลามา เมื่อฉันเปิดใช้งานและลงชื่อเข้าใช้เนื่องจากrootมีตัวแปรสภาพแวดล้อมบางอย่างที่ฉันตั้งค่า แต่ฉันจำไม่ได้หรือไม่ทราบว่ามาจากไหน

  • ฉันได้ตรวจสอบ~/.bash_profileแล้ว/etc/.bash_rcและสคริปต์เริ่มต้นทั้งหมด
  • ฉันวิ่งfindและgrepไม่มีประโยชน์

ฉันรู้สึกเหมือนฉันต้องลืมที่จะมองในบางสถานที่ที่ชัดเจน มีเคล็ดลับในการหาสิ่งนี้หรือไม่?


6
/etc/environmentเป็นอีกคนหนึ่ง
Derobert

8
และ/etc/env.d/*ไฟล์ต่างๆ แต่การทำgrep -R "YOUR_VARIABLE" /etc/อาจเป็นวิธีที่ดีที่สุดในการค้นหา
rozcietrzewiacz


@rozcietrzewiacz วิธีที่ง่ายที่สุด ... ถ้าตัวแปรอยู่ที่ไหนสักแห่งภายใต้ / etc / (เช่นในกรณีของฉัน); หากคุณโพสต์ไว้เป็นคำตอบฉันจะ upvote;)
Line

คำตอบ:


55

หากคุณใช้envคำสั่งเพื่อแสดงตัวแปรพวกเขาควรจะแสดงอย่างคร่าวๆตามลำดับที่พวกเขาสร้างขึ้น คุณสามารถใช้สิ่งนี้เป็นแนวทางได้หากระบบถูกกำหนดไว้ตั้งแต่เริ่มต้นในการบูตหรือโดยไฟล์. profile หรือไฟล์การกำหนดค่าอื่น ๆ ในภายหลัง จากประสบการณ์ของฉันคำสั่งsetและexportจะเรียงลำดับตัวแปรตามลำดับตัวอักษรเพื่อให้รายการไม่มีประโยชน์


1
เยี่ยมมาก ... ยกเว้นฉันพยายามค้นหาว่ามีอะไรบ้างที่ล้างตัวแปรสภาพแวดล้อม (ตั้งค่าใน / etc / environment) :-) (และใช่มันถูกตั้งค่าเริ่มต้น ... ฉันเพิ่มบรรทัดในสคริปต์ต่างๆเพื่อเข้าสู่ระบบที่จะได้รับการล้าง ... )
Michael Scheper

127

หากzshเป็นเชลล์ล็อกอินของคุณ:

zsh -xl

ด้วยbash:

PS4='+$BASH_SOURCE> ' BASH_XTRACEFD=7 bash -xl 7>&2

ที่จะจำลองการเข้าสู่ระบบเชลล์และแสดงทุกอย่างที่ทำ (ยกเว้นในพื้นที่ที่ stderr ถูกเปลี่ยนเส้นทางด้วยzsh) พร้อมกับชื่อของไฟล์ที่ถูกตีความในปัจจุบัน

ดังนั้นสิ่งที่คุณต้องทำคือค้นหาชื่อของตัวแปรสภาพแวดล้อมของคุณในเอาต์พุตนั้น (คุณสามารถใช้scriptคำสั่งเพื่อช่วยให้คุณเก็บเอาท์พุทเซสชั่นเชลล์ทั้งหมดหรือสำหรับbashวิธีการให้ใช้7> file.logแทน7>&2การเก็บxtraceเอาท์พุทไปfile.logเป็นแทนเทอร์มินัล)

หากตัวแปรของคุณไม่ได้อยู่ในที่นั่นจากนั้นอาจจะเปลือกได้รับมรดกในการเริ่มต้นจึงตั้งไว้ก่อนเช่นในการกำหนดค่า PAM ใน~/.ssh/environmentหรือสิ่งที่อ่านเมื่อเริ่มต้นเซสชั่น X11 ของคุณ ( ~/.xinitrc, ~/.xsession) หรือตั้งอยู่บนความละเอียดบริการที่เริ่มต้นการเข้าสู่ระบบ manager หรือก่อนหน้านี้ในสคริปต์บูตบางตัว จากนั้นfind /etc -type f -exec grep -F THE_VAR {} +อาจช่วย


4
น่าประทับใจและเป็นประโยชน์ขอบคุณ สำหรับเรา n00bs คุณจะอธิบายเพิ่มเติมเล็กน้อยเกี่ยวกับโหมดและวิธีที่เราจะออกจากโหมดนี้ทำให้เราเข้า ตัวอย่างเช่นเราไม่สามารถแปะผลลัพธ์นี้
Geoffrey Hale

5
@ GeoffreyHale ถ้าคุณzsh -xl 2>&1รวม stderr และ stdout ouputs คุณสามารถ grep ได้ตามปกติ
Rakesh

1
มีวิธีทำกับfishเชลล์ไหม?
Nick Sweeting

แม้ว่าผมจะใช้zsh -xl 2>&1อย่างใดฉันไม่สามารถ grep ปกติ เห็นได้ชัดว่าการส่งออกไม่ได้มีการขึ้นบรรทัดใหม่หรือสิ่งที่เหมาะสม
Xerus

ฉันคิดว่าคุณสามารถใช้PS4='+$BASH_SOURCE> ' BASH_XTRACEFD=7 bash -xl 7>/tmp/$(uuidgen)แล้ว grep ในไฟล์สุ่มนั้นเช่นกัน
bd1251252

50

สถานที่ที่ต้องมองหาก่อน:

ระบบกว้าง

  • /etc/environment: มีความหมายเฉพาะสำหรับตัวแปรสภาพแวดล้อม
  • /etc/env.d/*: ตัวแปรสภาพแวดล้อมแบ่งเป็นหลายไฟล์
  • /etc/profile: สคริปต์เริ่มต้นทุกประเภท
  • /etc/profile.d/*: สคริปต์การเริ่มต้น
  • /etc/bashrc, /etc/bash.bashrc: ตั้งใจสำหรับฟังก์ชั่นและชื่อแทน

เฉพาะผู้ใช้

  • ~/.bash_profile: การเริ่มต้นสำหรับเชลล์ล็อกอิน (bash-)
  • ~/.bashrc: การเริ่มต้นสำหรับเชลล์แบบโต้ตอบ (bash-) ทั้งหมด
  • ~/.profile: ใช้สำหรับกระสุนทั้งหมด
  • ~/.cshrc, ~/.zshrc, ~/.tcshrc: คล้ายกันสำหรับเปลือกหอยที่ไม่ใช่ทุบตี

31

@Cian ถูกต้อง นอกเหนือจากการใช้findและgrepไม่มีอะไรที่คุณสามารถทำได้เพื่อค้นหาว่ามาจากไหน เมื่อรู้ว่าเป็นตัวแปรสภาพแวดล้อมฉันจะพยายามมุ่งเน้นการค้นหาของคุณใน / etc / และไดเรกทอรีบ้านของคุณ แทนที่VARIABLEด้วยตัวแปรที่เหมาะสมที่คุณกำลังค้นหา:

$ grep -r VARIABLE /etc/*

$ grep -r VARIABLE ~/.*


1
มันน่าแปลกใจที่คำตอบที่บอกว่า 'คุณไม่สามารถ' ล้อมรอบด้วยคำตอบที่บอกว่า 'ใช่คุณทำได้' มี upvotes มากมาย
Michael Scheper

ฉันไม่เห็นคำตอบใด ๆ ที่ให้วิธีกำหนดตัวแปรที่ตั้งไว้ มีเงื่อนงำที่มีประโยชน์บางอย่าง แต่ไม่มีสายการบินเดียวที่สามารถทำงานได้
Andrew Wagner

สิ่งนี้แก้ไขเวลาของฉัน Thanx
Hassan Raza

@MichaelScheper "คุณไม่สามารถ" ทำได้โดยไม่ต้องค้นหา / grep ต่อมาใน "คุณสามารถ" มันอธิบายวิธีการใช้ grep
Line

23

หากคุณใส่set -xในของคุณ.profileหรือ.bash_profileทุกคำสั่งเชลล์ที่ตามมาจะได้รับการบันทึกลงในข้อผิดพลาดมาตรฐานและคุณสามารถดูได้ว่าหนึ่งในพวกเขากำหนดตัวแปรเหล่านี้ คุณสามารถใส่set -xที่ด้านบนของ/etc/profileเพื่อติดตามได้เช่นกัน exec 2>/tmp/profile.logการส่งออกอาจจะละเอียดมากดังนั้นคุณอาจต้องการที่จะเปลี่ยนเส้นทางไปยังไฟล์ที่มีสิ่งที่ต้องการ

หากระบบของคุณใช้ PAM มองหาpam_envการร้องขอโหลดหรือ/etc/pam.conf /etc/pam.d/*โมดูลนี้โหลดตัวแปรสภาพแวดล้อมจากไฟล์ที่ระบุหรือจากค่าเริ่มต้นของระบบหากไม่มีการระบุไฟล์ ( /etc/environmentและ/etc/security/pam_env.confบน Debian และ Ubuntu) ไฟล์อื่นที่มีนิยามตัวแปรสภาพแวดล้อมบน Linux คือ/etc/login.defs(มองหาบรรทัดที่ขึ้นต้นด้วยENV_)


5

ตรวจสอบสคริปต์เริ่มต้นของคุณสำหรับไฟล์ที่พวกเขาที่มาใช้.(dot) sourceหรือ ไฟล์เหล่านั้นอาจจะอยู่ในไดเรกทอรีอื่น ๆ นอกเหนือจากและ/etc$HOME


2

สำหรับzshผู้ใช้การติดตามไฟล์ที่เข้าถึงได้ (ในระหว่างการเริ่มต้น) จะมีประโยชน์พวกเขาไม่มากเกินไปและหนึ่งสามารถตรวจสอบพวกเขาทีละคนเพื่อค้นหาสิ่งที่ถูกกำหนด

zsh -o SOURCE_TRACE

0

ตัวแปรสภาพแวดล้อมถูกเก็บไว้ในไฟล์ / etc / profile ดังนั้นให้ทำมากขึ้น / etc / profile และเพียงตรวจสอบตัวแปร env ที่คุณต้องการและถ้า / etc / profile ไม่ปรากฏแล้ว lokk สำหรับไฟล์. profile ในไดเรกทอรีบ้านของคุณ


1
ตัวแปรสภาพแวดล้อมไม่ได้ถูกจัดเก็บไว้ใน/etc/profileคุณสามารถกำหนดให้มีทั้งระบบเช่นbashเมื่อใช้เป็นเชลล์การเข้าสู่ระบบ จะถูกเก็บไว้โดยกระบวนการเชลล์หลังจากอ่านคำจำกัดความจากไฟล์และ / หรือ commandline
Anthon

-2

ตัวอย่างเช่นหากคุณต้องการค้นหาตัวแปร HISTFILE และค่าหรือต้องการทราบว่าตัวแปรใดที่ถูกกำหนดเกี่ยวกับประวัติคุณจะต้องพิมพ์สิ่งนี้ในเชลล์:

set | grep HIST
env | grep HIST
printenv | grep HIST

ถ้าคุณรู้อยู่แล้วว่าชื่อที่ว่าทำไมไม่echo "$HISTFILE"?
Jeff Schaller

เนื่องจากเราต้องการค้นหาว่าตัวแปร $ HISTFILE ถูกกำหนดไว้ที่ใด นอกจากนี้หากฉันไม่ต้องการทราบว่าตัวแปรใดถูกกำหนดเกี่ยวกับประวัติ
Vusal Aliyev

2
แต่น่าเสียดายที่setไม่ได้บอกคุณว่าไฟล์กำหนดตัวแปร
Jeff Schaller
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.