ในการตีความผังงานนี้
ฉันพบว่าในคนทุบตี:
เมื่อ bash ถูกเรียกใช้เป็นเชลล์ล็อกอินแบบโต้ตอบหรือเป็นเชลล์แบบไม่โต้ตอบที่มีตัวเลือก --login มันจะอ่านและเรียกใช้คำสั่งจากไฟล์ / etc / profile ก่อนหากไฟล์นั้นมีอยู่
ระบุว่าเชลล์ล็อกอินแบบโต้ตอบอ่าน/etc/profile
(โดยไม่มี --noprofile)
นอกจากนี้เชลล์ที่ไม่มีการโต้ตอบพร้อมตัวเลือกการ--login
อ่าน/etc/profile
ที่ดูเหมือนว่าจะปล่อยให้บางอย่างที่เป็นไปได้เข้าสู่ระบบเปลือกหอย (ซึ่ง$0
เริ่มต้นด้วย-
) ที่ถูกไม่โต้ตอบ (เรียกใช้สคริปต์ที่อาจจะเป็นง่ายๆเป็นdate
) อาจจะไม่อ่าน /etc/profile
(ที่มา)
หากต้องการยืนยันหรือปฏิเสธแนวคิดนี้:
ก่อนอื่นฉันพยายามใช้su -l -
ซึ่งเริ่มต้นเชลล์การเข้าสู่ระบบด้วย-
อักขระตัวแรก แต่ฉันไม่สามารถทำให้มันเป็นแบบไม่โต้ตอบ (และสามารถแสดงการทดสอบเพื่อตรวจสอบได้)
เรียกสิ่งที่ชอบ
$ bash -c 'date' -bash
ไม่รายงานว่าเป็นเชลล์ล็อกอิน (แม้ว่าอักขระตัวแรกคือ-
)
ลองใช้วิธีนี้เพื่อเปิดเผยรายละเอียด:
$ bash -c 'echo "$0 $- ||$(shopt -p login_shell)||";date' -bash -bash hBc ||shopt -u login_shell|| Fri Aug 19 06:32:31 EDT 2016
$0
มี-
เป็นตัวอักษรตัวแรกไม่มีi
(interactive) ในมูลค่าของ$-
แต่มันก็ไม่ได้รายงานเป็นlogin_shell
(-u) ที่ ในกรณีนี้ไม่ได้อ่าน / etc / profile แต่ฉันไม่แน่ใจว่านี่เป็นการทดสอบที่ถูกต้อง
นอกจากนี้ยังมีการกล่าวถึง "เชลล์การเข้าสู่ระบบแบบไม่โต้ตอบที่หายาก" ในคำตอบนี้โดยไม่เจาะจงเพียงพอสำหรับคำถามนี้
ข้อสรุปของผู้ชายคนนี้คือการที่/etc/profile
จะอ่านเสมอ
อ่านตารางสรุป: อ่านเชลล์ล็อกอินทั้งแบบโต้ตอบและไม่โต้ตอบ /etc/profile
และหากตัวอย่างจากหน้านี้ถูกต้อง:
Some examples
$ su bob # interactive non-login shell
$ su - bob # interactive login shell
$ exec su - bob # interactive login shell
$ exec su - bob -c 'env' # non-interactive login shell
$ ssh bob@example.com # interactive login shell, `~/.profile`
$ ssh bob@example.com env # non-interactive non-login shell, `~/.bashrc`
การทดสอบexec su - bob -c 'env'
รายงานที่/etc/profile
อ่าน
ในระยะสั้น:
เป็นไปได้หรือไม่ที่จะมีเชลล์ล็อกอินแบบไม่โต้ตอบ (ไม่ถูกเรียกด้วย --login หรือ -l)?
และถ้าเป็นจริงมันอ่าน/etc/profile
ไฟล์หรือไม่
หากข้างต้นเป็นจริงเราต้องสรุปว่าALL login shells [แบบโต้ตอบ (หรือไม่)] อ่าน / etc / profile (ไม่มี--noprofile
ตัวเลือก)
หมายเหตุ: เพื่อตรวจสอบว่า / etc / profile กำลังอ่านอยู่ให้เพิ่มที่จุดเริ่มต้นของไฟล์ที่คำสั่งนี้:
echo "'/etc/profile' is being read"
--login
ตัวเลือก สำหรับอันที่สองถ้าฉันจะexec -a "-bash" "bash" <<<"shopt -p login_shell; echo $0 $-"
ได้รับ (เข้ารหัสใน C qoutes)$'/etc/profile read\nshopt -s login_shell\nbash himBH'
ดังนั้นมันคือการเข้าสู่ระบบ แต่มันเป็นแบบโต้ตอบ เราจำเป็นต้องเข้าสู่ระบบและไม่โต้ตอบ อะไรที่ฉันขาดหายไป