เชลล์ล็อกอินและเชลล์ที่ไม่ใช่การล็อกอินคืออะไร?


78

ได้มีการกล่าวว่าการตั้งค่าสำหรับเปลือกไม่ใช่เพื่อเข้า.bashrcสู่การตั้งค่าไฟล์และเข้าสู่ระบบเปลือกเพื่อเข้าสู่.profileไฟล์

เชลล์ล็อกอินและเชลล์ที่ไม่ใช่การล็อกอินมีความหมายอย่างไร

โปรดอธิบายโดยไม่ใช้ศัพท์แสงทางเทคนิคเท่าที่จะทำได้

คำตอบ:


83

ใส่เพียง:

  • หากคุณเปิดเชลล์หรือเทอร์มินัล (หรือเปลี่ยนเป็นหนึ่ง) และมันขอให้คุณเข้าสู่ระบบ (ชื่อผู้ใช้? รหัสผ่าน?) ก่อนที่มันจะแจ้งให้คุณมันเป็นเชลล์การเข้าสู่ระบบ
  • หากไม่ใช่ (เช่นgnome-terminal ) และช่วยให้คุณใช้งานได้ทันทีมันเป็นเชลล์ที่ไม่ใช่การเข้าสู่ระบบ

หากคุณเป็นผู้ใช้งานปกติของ Ubuntu Desktop เพียงแค่ล็อกอินเชลล์คือ ... เดสก์ท็อปของคุณ (คุณพิมพ์รหัสผ่านเพื่อเข้าใช้ใช่ไหม)? ในทางเทคนิคแล้วมันคือเชลล์การล็อกอินที่เริ่ม GUI แต่มันเข้าสู่ศัพท์แสง และใช่มันจะอ่านการตั้งค่าใน.profile

ในครั้งเดียวที่คุณ (ผู้ใช้ปกติ) อาจจะเห็นเชลล์ล็อกอินที่ดูเหมือนเชลล์ล็อกอินคือถ้าคุณมีปัญหากับเดสก์ท็อปของคุณและคุณเปลี่ยนไปใช้เทอร์มินัลเสมือนด้วยCtrl+ Alt+ F1ทางลัด


กรณีทั่วไปอื่น ๆ สำหรับการมีเปลือกเข้าสู่ระบบรวมถึง:

  • เข้าถึงคอมพิวเตอร์ของคุณจากระยะไกลผ่านssh(หรือเชื่อมต่อภายในกับssh localhost)
  • จำลองเชลล์ล็อกอินเริ่มต้นด้วยbash -l(หรือsh -l)
  • จำลองrootเชลล์ล็อกอินเริ่มต้นด้วยsudo -i
    • หรือสำหรับผู้ที่ไม่ใช่ผู้ใช้รายอื่นsudo -u username -iroot
  • ตรวจสอบเป็นอีกที่ไม่ใช่rootผู้ใช้ที่มี(และพวกเขารหัสผ่าน)su - username
  • ใช้sudo loginคำสั่งเพื่อสลับผู้ใช้

หากฉันเริ่มต้น Eclipse IDE จากเทอร์มินัลจะเปิดขึ้นตามที่คาดไว้ แต่ถ้าฉันพยายามเปิดโดยการคลิกที่ไอคอน Eclipse จะไม่สามารถจดจำตำแหน่ง Java ได้ (ยกเว้นว่า PATH สำหรับ Java ตั้งอยู่ในไฟล์. profile) นั่นหมายถึงการคลิกที่ไอคอน Eclipse ต้องการเชลล์ล็อกอินทำไม?
DUKE

2
@DUKE, ไม่, หมายความว่าจำเป็นต้องตั้งค่าตัวแปรสภาพแวดล้อมแตกต่างกันเมื่อคุณใช้เดสก์ท็อป / GUI กับระบบคอนโซลบรรทัดเดียวเท่านั้น ใส่ PATH ของคุณ ฯลฯ ใน~/.pam_environment(ตัวแปรเท่านั้นไม่มีคำสั่ง bash ในนั้น!) ออกจากระบบเข้าสู่ระบบและดูทุกสิ่งที่ปรากฏอย่างน่าอัศจรรย์ในเดสก์ท็อปเช่นเดียวกับใน gnome-terminal!
ish

1
เข้าสู่ระบบผ่าน ssh ไม่ได้เรียกเปลือกเข้าสู่ระบบ มันไม่โหลด/etc/profile, หรือ/etc/profile.d ~/.profile
xuhdev

ดูคำถามนี้
xuhdev

@xuhdev เข้าสู่ระบบผ่าน ssh เรียกใช้เปลือกเข้าสู่ระบบและมันจะโหลด / etc / profile, /etc/profile.d และ ~ / .bash_profile
MichaelZ

9

ฉันไม่คิดว่าคำตอบที่ถูกต้องสามารถให้ได้โดยไม่ต้อง "ศัพท์แสงทางเทคนิค" เนื่องจากคำถามนี้เป็นคำถามแรกที่โผล่ขึ้นมาใน Google สำหรับข้อความค้นหา "เปลือกหอยเข้าสู่ระบบ" คืออะไรฉันจึงให้คำตอบที่ถูกต้องมากขึ้นด้านล่าง:

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

  1. การรันเชลล์ด้วย-lหรือ--loginอาร์กิวเมนต์สมมติว่ามันรู้ (ฉันไม่รู้เชลล์ใด ๆ ที่ไม่ทราบ-lแต่--loginมีเชลล์เพียงไม่กี่ตัวที่รองรับ)
  2. การรันเชลล์ด้วยการargv[0]ตั้งค่าเป็น-{some_string}(เช่นกับ HYPHEN-MINUS prepended เป็นปกติargv[0]หรือกับสตริงอื่น ๆ ) นี่คือสิ่งที่ ssh และ su ทำ: su เพียงเรียกใช้ปฏิบัติการด้วย-suเป็นargv[0](สวัสดีทุกคนคิดว่าargv[0]มีบางอย่างที่เกี่ยวข้องกับชื่อเรียกใช้งานได้ในปัจจุบัน), ssh รัน zsh ด้วย-zshเมื่อผู้ใช้ตั้งค่า/bin/zshเป็นเชลล์ของเขา

ความเป็นกันเองของเชลล์ไม่มีอะไรเกี่ยวข้องกับใครเลยที่ขอรหัสผ่านหรือดำเนินการตามขั้นตอนการตรวจสอบอัตโนมัติอื่น ๆ บางโปรแกรมเช่น ssh หรือล็อกอิน (หรือเทอร์มินัลอีมูเลเตอร์เช่น urxvt) เรียกใช้เชลล์เป็นโปรแกรมเข้าสู่ระบบโดยใช้argv[0]ที่เริ่มต้นด้วย HYPHEN-MINUS บางอย่างเช่น su หรือ sudo (หรือ zsh: ดู-ตัวแก้ไขคำสั่งล่วงหน้าที่อธิบายไว้ในส่วน PRECOMMAND MODIFIERS ในman zshmisc) ไม่ได้ทำตามค่าเริ่มต้น แต่สามารถบอกได้ บางคนมีตัวเลือกเดียวในการบอกเชลล์ให้เข้าสู่ระบบโดยใช้อาร์กิวเมนต์ (เช่นbash -l): ssh พร้อมอาร์กิวเมนต์คำสั่ง (ที่แจ้งให้ ssh ทราบว่าจะรันบนรีโมตปลายทางอย่างชัดเจน)

โดยทั่วไปจะดีกว่าที่จะปรึกษาก่อนเอกสารของโปรแกรมที่ใช้ในการเรียกเปลือกเพื่อตรวจสอบว่าเปลือกจะเป็นหนึ่งในการเข้าสู่ระบบและครั้งที่สองดำเนินการทดสอบบางอย่างเพื่อตรวจสอบว่าแอปจะเปิดตัวเปลือกเข้าสู่ระบบ (เช่นโดยการเพิ่มechoการ.profile)


ฉันสนใจในตัวเลือกที่สอง: ฉันจะเปลี่ยน argv [0] อย่างไรก่อน (หรือหลัง) เรียกใช้ bash? สามารถทำได้จากบรรทัดคำสั่งหรือไม่
VeryHardCoder

@VeryHardCoder สิ่งนี้ขึ้นอยู่กับแอปพลิเคชันที่คุณใช้เพื่อเรียกใช้คำสั่ง ในรหัส C จะกระทำโดยการส่งโดยตรงargv[0]ไปยังหนึ่งในexec*ฟังก์ชั่นธรรมชาติและหลีกเลี่ยงไม่ได้: คุณมักจะจัดหาทั้งสอง argv[0]และเส้นทางไปยังคำสั่งที่ใช้จริงเมื่อใช้exec*ฟังก์ชั่นแม้ว่าคุณไม่ต้องการargv[0]ที่จะแตกต่างจากคำสั่งเรียกใช้ ภาษาอื่นให้วิธีการของตนเอง โดยเฉพาะทุบตีอนุญาตให้ใช้exec -a new_argv0 bashแต่ของหลักสูตรที่จะเข้ามาแทนที่กำลังทำงานเปลือกกับสิ่งที่คุณexeced ดังนั้นคุณอาจต้องใช้ subshell ( (exec -a -zsh zsh))
ZYX

ตกลงเข้าใจแล้ว! ที่จริงแล้วสามารถทำได้แม้ในวิธีที่ง่ายกว่า: (exec -l bash) ...
VeryHardCoder

1
ความแตกต่างในการทำงานระหว่างสองคืออะไร? นี่เป็นเพียงธงบูลีนหรือไม่?
Alexey

@Alexey ความแตกต่างของฟังก์ชั่นหลักคือชุดของไฟล์กำหนดค่าที่ใช้เมื่อเริ่มต้น $0และบางทีอาจเป็นอย่างอื่น (ตัวแปรการตั้งค่าและอื่น ๆ ) ได้รับการตั้งค่าเพื่อให้ความสามารถในการตรวจพบเชลล์ในไฟล์กำหนดค่า แต่ใครที่รบกวนการตรวจจับนี้จริง ๆ แล้วมันจะสร้างความแตกต่าง? นั่นคือทั้งหมดที่ฉันรู้.
ZyX
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.