แยกความแตกต่างของการเข้าสู่ระบบอินเทอร์แอคทีฟและเชลล์ที่ไม่ใช่ของอินเทอร์แอคทีฟ


25

ฉันกำลังพยายามแยกความแตกต่างของการเข้าสู่ระบบสี่คำที่ไม่ใช่การเข้าสู่ระบบแบบโต้ตอบและไม่โต้ตอบ :

  • แบบโต้ตอบ - เชลล์ล็อกอิน
  • แบบโต้ตอบ - เชลล์ที่ไม่ใช่การล็อกอิน
  • ไม่ใช่แบบโต้ตอบ - ล็อกอินเชลล์
  • ไม่ใช่แบบโต้ตอบ - เชลล์ที่ไม่ได้ล็อกอิน

ที่ฉันเข้าใจ
แบบโต้ตอบ - เข้าสู่ระบบเชลล์ : เริ่มต้นระบบเข้าสู่ระบบและเปิดเทอร์มินัลและ
ไม่โต้ตอบ - เข้าสู่ระบบเชลล์ : telnet กับระบบและเข้าสู่ระบบ

แต่สิ่งที่เกี่ยวกับเปลือกโต้ตอบ - เข้าสู่ระบบ?
มันเข้าสู่ระบบเปิด terminal เสมือนและเข้าสู่ระบบ? และ
ไม่ใช่แบบโต้ตอบ - ไม่ใช่เชลล์, มันใช้สคริปต์อัตโนมัติใน crontab หรือไม่?

คำตอบ:


38

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

สั้น ๆ (ดูที่นี่สำหรับรายละเอียดเพิ่มเติม) พร้อมตัวอย่าง:

  • เปลือกเข้าสู่ระบบแบบโต้ตอบ:sshคุณเข้าสู่ระบบคอมพิวเตอร์ระยะไกลผ่านทางตัวอย่างเช่น อีกวิธีหนึ่งคือคุณวางลงบน tty บนเครื่องโลคัล ( Ctrl+ Alt+ F1) และล็อกอินที่นั่น

  • เชลล์ที่ไม่ได้ล็อกอินแบบโต้ตอบ:เปิดเทอร์มินัลใหม่

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

  • เชลล์ล็อกอินแบบไม่โต้ตอบ:นี่หายากมากและคุณไม่ชอบที่จะพบมัน echo command | ssh serverวิธีการหนึ่งของการเปิดตัวที่หนึ่งคือ เมื่อsshเปิดใช้โดยไม่มีคำสั่ง (ดังนั้นsshแทนที่จะเป็นssh commandที่ทำงานcommandบนเปลือกระยะไกล) มันเริ่มเปลือกเข้าสู่ระบบ หาก the stdinthe sshไม่ใช่ tty มันจะเริ่มต้นเชลล์ที่ไม่มีการโต้ตอบ นี่คือเหตุผลที่echo command | ssh serverจะเรียกใช้เชลล์การล็อกอินที่ไม่โต้ตอบ bash -l -c commandนอกจากนี้คุณยังสามารถเริ่มต้นหนึ่งที่มี

หากคุณต้องการเล่นกับสิ่งนี้คุณสามารถทดสอบเชลล์ประเภทต่างๆดังนี้:

  • เปลือกนี้เป็นแบบโต้ตอบหรือไม่?

    ตรวจสอบเนื้อหาของ$-ตัวแปร สำหรับเชลล์แบบโต้ตอบมันจะรวมi:

    ## Normal shell, just running a command in a terminal: interacive
    $ echo $-
    himBHs
    ## Non interactive shell
    $ bash -c 'echo $-'
    hBc
  • นี่เป็นเชลล์ล็อกอินหรือไม่

    นอกจากนี้ไม่มีวิธีแบบพกพาของการตรวจสอบนี้ แต่สำหรับทุบตีคุณสามารถตรวจสอบว่าlogin_shellตัวเลือกคือชุด:

    ## Normal shell, just running a command in a terminal: interacive
    $ shopt login_shell 
    login_shell     off
    ## Login shell; 
    $ ssh localhost
    $ shopt login_shell 
    login_shell     on

นำทั้งหมดนี้มารวมกันนี่เป็นหนึ่งในประเภทกระสุนที่เป็นไปได้:

## Interactive, non-login shell. Regular terminal
$ echo $-; shopt login_shell
himBHs
login_shell     off

## Interactive login shell
$ bash -l
$ echo $-; shopt login_shell
himBHs
login_shell     on

## Non-interactive, non-login shell
$ bash -c 'echo $-; shopt login_shell'
hBc
login_shell     off

## Non-interactive login shell
$ echo 'echo $-; shopt login_shell' | ssh localhost
Pseudo-terminal will not be allocated because stdin is not a terminal.
hBs
login_shell     on

ฉันต้องการที่ชัดเจนว่า 1) สำหรับฉันเข้าสู่ระบบเพื่อ gui หมายถึงการเริ่มต้นระบบเข้าสู่ระบบและเปิดสถานี 2) การทำ telnet หรือ ssh เป็นเปลือกเข้าสู่ระบบแบบโต้ตอบหมายถึงตัวอย่างที่ฉันได้รับ non-interactive login shellมันผิด
เดซี่

@ เดซี่ขอบคุณสำหรับการชี้แจง; แก้ไขคำตอบแล้ว
terdon

โอเคและ gui ไม่เกี่ยวข้องกับเชลล์ที่ไม่ใช่การเข้าสู่ระบบแบบโต้ตอบ: เพียงแค่เปิดเทอร์มินัลใหม่ในพื้นที่หรือจากระยะไกลผ่าน telnet หรือ ssh
เดซี่

@daisy yep, เสียงถูกต้อง แต่โปรดอ่านคำตอบของมูรูอย่างระมัดระวังเช่นกันเพราะนั่นอธิบายว่าโดยหลักแล้วนี่เป็นเรื่องของความหมายและส่งผลกระทบต่อไฟล์เริ่มต้นที่เชลล์อ่าน ดูที่นี่สำหรับภาพรวมที่ครอบคลุมยิ่งขึ้นของประเภทเชลล์ที่แตกต่างกัน
terdon

เชลล์ล็อกอินที่ไม่ใช่แบบโต้ตอบไม่ใช่เรื่องผิดปกติตัวอย่างเช่น git ใช้ IIRC
quazgar

6

เป็นหลักไม่ว่าเชลล์จะเข้าสู่ระบบหรือไม่โต้ตอบหรือไม่สำคัญด้วยเหตุผลหนึ่งประการ:

ไฟล์การเริ่มต้นและการตั้งค่าตัวเลือกเริ่มต้นขึ้นอยู่กับว่าเชลล์เป็นล็อกอินหรือไม่และโต้ตอบหรือไม่

ตามลําดับไม่ว่าเชลล์จะเข้าสู่ระบบหรือไม่หรือแบบโต้ตอบหรือไม่ขึ้นอยู่กับการภาวนาที่ใช้ - ชื่อคำสั่งและตัวเลือก

คุณสมบัติสองอย่างเป็นอย่างอื่นมุมฉาก - ไม่ว่าเชลล์จะเข้าสู่ระบบหรือไม่มีผลต่อการพิจารณาว่ามันเป็นแบบโต้ตอบหรือไม่

Bash เริ่มต้นเปลือกเข้าสู่ระบบหากสิ่งเหล่านี้เป็นจริง:

  • argv[0]ชื่อของคำสั่งที่ถูกเรียกใช้เป็นเริ่มต้นด้วย -
  • ระบุ-lตัวเลือก

คล้ายกันทุบตีเริ่มเปลือกโต้ตอบถ้าสิ่งเหล่านี้เป็นจริง:

  • มันไม่ได้ระบุไฟล์ที่จะดำเนินการ (เช่นคำสั่งไม่ได้bash some/file) หรือสตริงคำสั่งที่จะเรียกใช้ ( bash -c 'foo') (เงื่อนไขจริงค่อนข้างซับซ้อนกว่าเล็กน้อยดูคู่มือ)
  • ระบุ-iตัวเลือก

โดยเฉพาะอย่างยิ่ง (และขัดแย้ง) หมายถึงหลังที่bash -ic 'foo'เริ่มเปลือกโต้ตอบ

ดังนั้นต่อไปนี้จะเริ่มต้นเข้าสู่ระบบ, เชลล์แบบโต้ตอบ, แม้ว่ามันจะไม่มีอะไรเกี่ยวข้องกับมัน, และการร้องขอนั้นไม่เกี่ยวข้องกับการเข้าสู่ระบบ:

bash -lic true

การเข้าสู่ระบบผ่านทางคอนโซลหรือ GUI เริ่มต้นเชลล์การเข้าสู่ระบบ (หรืออาจจะไม่ใช่) นั้นเป็นผลของกระบวนการเข้าสู่ระบบโดยใช้การร้องขอที่เหมาะสม

เงื่อนไขและผลกระทบที่จะมีการอธิบายในรายละเอียดในทุบตีด้วยตนเองส่วนที่เกี่ยวกับไฟล์เริ่มต้น


แหล่งที่มาของความสับสนที่สำคัญคือมีความหมายทั่วไปอีกอย่างสำหรับเชลล์ "ล็อกอิน":

เชลล์ล็อกอินของผู้ใช้คือเชลล์ที่กำหนดไว้ในpasswdรายการของผู้ใช้นั้น(ซึ่งอาจมาจาก/etc/passwdLDAP หรือแหล่งอื่น ๆ )

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

กระบวนการล็อกอินบางอย่างจะเริ่มเชลล์ล็อกอินของผู้ใช้เป็นเชลล์ล็อกอิน

โปรดทราบว่าการเข้าสู่ระบบ GUI เริ่มต้นเชลล์การเข้าสู่ระบบอย่างหมดจดเพราะนักพัฒนาคิดว่าสะดวก - LightDM เรียกใช้สคริปต์ในการเข้าสู่ระบบซึ่งเห็นได้ชัดว่าไม่ใช่การโต้ตอบและแน่นอนไม่ขึ้นอยู่กับเชลล์การเข้าสู่ระบบของผู้ใช้ อย่าพึ่งตัวจัดการการแสดงผลที่เริ่มต้นเชลล์การเข้าสู่ระบบ แต่ไม่ใช่ทั้งหมดที่ทำและใน Wayland และ GNOME กระบวนการล็อกอินไม่ได้ใช้เชลล์สคริปต์เลย


3

เชลล์ล็อกอิน:

กระบวนการแรกที่ดำเนินการภายใต้ ID ผู้ใช้ของเราเมื่อเราเข้าสู่เซสชัน กระบวนการล็อกอินบอกให้เชลล์ทำตัวเป็นเชลล์ล็อกอินด้วยแบบแผน: ผ่านอาร์กิวเมนต์ 0 ซึ่งโดยปกติจะเป็นชื่อของเชลล์ที่สามารถใช้งานได้โดยมีอักขระ“ -” ที่ต่อท้าย

เปลือกโต้ตอบ:

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

ใส่ง่าย ๆ : เชลล์แบบโต้ตอบต้องการอินพุตของผู้ใช้ในขณะที่เชลล์แบบไม่โต้ตอบถูกเรียกใช้โดยสคริปต์และไม่ต้องการอินพุตของผู้ใช้


ดังนั้นตัวอย่างที่ให้มาถูกต้อง
เดซี่

ใช่เดซี่ของคุณถูกที่แล้ว
George Udosen

1
@daisy no! GUI ไม่มีส่วนเกี่ยวข้องกับเรื่องนี้ นี่เป็นเรื่องเกี่ยวกับเชลล์บรรทัดคำสั่งไม่ใช่เชลล์กราฟิก (ซึ่งมีอยู่ แต่เป็นสัตว์ร้ายที่แตกต่างกัน)
terdon

1
@George no มีข้อผิดพลาดสองประการ: การเข้าสู่ระบบผ่าน GUI ไม่เริ่มต้นเชลล์การเข้าสู่ระบบ (หรือเชลล์ชนิดอื่นที่เกี่ยวข้อง) และการล็อกอินเข้าสู่ระบบระยะไกลผ่าน telnet เริ่มต้น telnet shell แต่ผ่าน ssh จะเริ่มการล็อกอินแบบโต้ตอบ เปลือก.
terdon

1
@ George จริงฉันยืนแก้ไข ผู้จัดการล็อกอิน GUI บางคนอาจเริ่มเชลล์ล็อกอินให้อ่าน.profile(ฉันคิดว่าพวกเขาแค่มา.profileเอง แต่ฉันอาจผิด )
terdon

0

ฉันต้องการพูดถึงว่าคุณสามารถเริ่มต้นเปลือกเข้าสู่ระบบแบบโต้ตอบโดย:

  1. ดำเนินการsudo /bin/loginและพิมพ์ข้อมูลรับรองของคุณ
  2. การดำเนินการ exec -l /bin/bash
  3. การดำเนินการ su -
  4. และชอบคำตอบข้างต้นที่ระบุไว้โดยใช้ ssh และล็อกอินเข้าสู่เครื่องระยะไกล

นอกจากนี้คุณสามารถตรวจสอบ (ในทุบตี) ว่ามันเป็นเปลือกเข้าสู่ระบบโดยการพิมพ์echo $0และถ้าการส่งออกเริ่มต้นด้วยเส้นประ-แล้วมันเป็นเปลือกเข้าสู่ระบบ

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