มีเชลล์ล็อกอินที่ไม่มีการโต้ตอบหรือไม่?


14

ฉันรู้ว่าความแตกต่างระหว่างเชลล์แบบโต้ตอบ / ไม่โต้ตอบและเปลือกหอยเข้าสู่ระบบ / ไม่ใช่ลงชื่อเข้าใช้เป็นอย่างไร แต่ดูเหมือนว่าในทางปฏิบัติแล้วจะไม่มีเปลือกหอยเข้าสู่ระบบที่ไม่ใช่แบบโต้ตอบเว้นแต่ว่าคุณมี/bin/bash --login some-script.shสคริปต์ในสคริปต์ แปลก ๆ ) สิ่งนี้ถูกต้องหรือเป็นเรื่องธรรมดามากขึ้นหรือไม่


7
telnet towel.blinkenlights.nlสำหรับเชลล์ล็อกอินที่ไม่ใช่แบบโต้ตอบ ;-)
Martin Tournoij

1
คำถามนี้เป็นคำตอบสั้น ๆ ที่อยู่ในคำตอบอีกต่อไปนี้
สัญลักษณ์แทน

@CaptainMan: ดูคำตอบเรามีสองสิ่งที่มุ่งเน้นไปที่ความหมายที่แตกต่างกันของ "การโต้ตอบ" ด้วยเหตุนี้คุณสามารถขยายคำตอบของคุณเล็กน้อยเพื่ออธิบายความหมายที่คุณใช้เมื่อคุณถามคำถาม
cjs

คำตอบ:


10

ผมถือว่าคุณกำลังพูดคุยเกี่ยวกับแนวคิดทุบตีของการเข้าสู่ระบบกับที่ไม่ได้เข้าสู่ระบบและการโต้ตอบกับเปลือกหอยทุบตีไม่โต้ตอบตามที่อธิบายไว้ในการภาวนาส่วนของ manpage (ซึ่งแตกต่างจากการตีความในคำตอบของJames Youngmanเกี่ยวกับคำสั่งโดยพลการใด ๆ ที่ใช้เป็น "shell" (หรือล่ามคำสั่งผู้ใช้) ในpasswd(5)ไฟล์และไม่ว่าโปรแกรมนั้นจะยอมรับการป้อนข้อมูลของผู้ใช้หรือ/usr/sbin/nologinไม่ )

คุณถูกต้องที่/bin/bash --login some-script.shจะสร้างการเข้าสู่ระบบแบบไม่โต้ตอบ Bash และนี่อาจเป็นตัวอย่างทางพยาธิวิทยา มีกรณีหนึ่งอาจจะเป็นเรื่องผิดปกติ ssh somehost < some-fileแต่ไม่แปลกอย่างแท้จริงที่ผลิตเปลือกเข้าสู่ระบบที่ไม่ใช่แบบโต้ตอบคือ: ที่นี่sshdจะเริ่มทุบตีด้วยargv[0]ชุด-bashเพราะไม่ได้รับคำสั่งเพื่อเรียกใช้ก่อให้เกิดการทุบตีที่จะต้องพิจารณาตัวเองเปลือกเข้าสู่ระบบ แต่เพราะ stdin ไม่ได้เชื่อมต่อไปยังสถานีทุบตีจะไม่ตั้งตัวเองไปยังโหมดโต้ตอบ ( $-จะไม่มีi) .

(โดยส่วนตัวแล้วกรณีนั้นดูเหมือนจะสมเหตุสมผลมากกว่าการสนทนาssh somehost somecommandซึ่งไม่ถือว่าเป็น "เชลล์การเข้าสู่ระบบ" แม้ว่าจะเป็นการเข้าสู่ระบบใหม่somehostเช่นเดียวกับที่กล่าวข้างต้น)

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


1

เชลล์ล็อกอินส่วนใหญ่โดยการนับบนระบบที่ติดตั้งใหม่นั้นไม่ใช่แบบโต้ตอบจริง:

$ awk -F:  '{print $7}' <  /etc/passwd | sort | uniq -c
  5 /bin/bash
 23 /bin/false
  1 /bin/sh
  1 /bin/sync
 17 /usr/sbin/nologin

ชัดเจน/bin/bashและ/bin/shเป็นกระสุนแบบดั้งเดิมและเป็นแบบโต้ตอบ แต่รายการอื่น ๆ ทั้งหมดในรายการนั้นไม่ใช่แบบโต้ตอบ หากคุณกำลังอ่านรายการและไม่ทราบว่าหนึ่งในนั้นทำอะไรคุณสามารถค้นหาหน้าคู่มือได้ (เช่นman nologinหรือman sync)

สิ่งที่คำสั่งทำจริง

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

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

หากคุณไม่เข้าใจว่าท่อกำลังทำอะไรคุณสามารถเรียกใช้เป็นกลุ่มเพื่อดูว่าเกิดอะไรขึ้น นอกจากนี้คุณยังสามารถอ่านหน้าคู่มือสำหรับคำสั่งที่มีการใช้ (ที่นี่awk, sortและuniq) จริงๆแล้วคุณควรทำอย่างนั้น ฉันจะรอ.

มารันขั้นตอนของการเพิ่มขั้นตอน (คุณสามารถทำได้อย่างปลอดภัยบนระบบ Unix ของคุณเอง):

~$ awk -F:  '{print $7}' <  /etc/passwd | sed -e 's/^/    /'
/bin/bash
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/bin/sync
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/usr/sbin/nologin
[ ... and so on, I've left the rest out ... ]

เอาต์พุตด้านบนเป็นเพียงเนื้อหาของฟิลด์ที่เจ็ดจาก/etc/passwdไฟล์ นั่นคือฐานข้อมูล (ไฟล์ข้อความตัวอักษร) ซึ่งบอกระบบว่าเชลล์ล็อกอินของทุกคนคืออะไร หากคุณต้องการที่จะหาข้อมูลเพิ่มเติมเกี่ยวกับ/etc/passwdเพียงแค่ไปอ่านมัน (มันของโลกสามารถอ่านได้) (man 5 passwd)และดูที่หน้าคู่มือสำหรับมัน

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

~$ awk -F:  '{print $7}' <  /etc/passwd | sort
/bin/bash
/bin/bash
/bin/bash
/bin/bash
/bin/bash
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
[ ... and so on, I've left the rest out ... ]

เราสามารถใช้โปรแกรมuniqเพื่อแสดงให้เราเห็นเฉพาะรายการที่ไม่ซ้ำกัน:

~ $ awk -F: '{พิมพ์ $ 7}' </ etc / passwd | จัดเรียง | uniq | sed -e 's / ^ / /' / bin / bash / bin / false / bin / sh / bin / ซิงค์ / usr / sbin / nologin

แต่เดี๋ยวก่อนไม่มีประโยชน์มีกี่คน? ลองถามuniq(อ่านหน้าคน!):

~$ awk -F:  '{print $7}' <  /etc/passwd | sort | uniq -c
      5 /bin/bash
     23 /bin/false
      1 /bin/sh
      1 /bin/sync
     17 /usr/sbin/nologin

นั่นคือผลลัพธ์ที่เราเห็นที่ด้านบนสุดของคำตอบแน่นอน ลองจัดเรียงอีกครั้งเพื่อดูรายการตามลำดับ:

~$ awk -F:  '{print $7}' <  /etc/passwd | sort | uniq -c | sort
     17 /usr/sbin/nologin
      1 /bin/sh
      1 /bin/sync
     23 /bin/false
      5 /bin/bash

รอที่ไม่สามารถได้รับสิทธิ 17 มาก่อนวันที่ 1 และ 5 หลังจากที่ 23. ปัญหาคือว่ารายการที่มีการเรียงlexicographically ขอsortเรียงลำดับตัวเลขและเรียงกลับกัน:

~$ awk -F:  '{print $7}' <  /etc/passwd | sort | uniq -c | sort -n -r
     23 /bin/false
     17 /usr/sbin/nologin
      5 /bin/bash
      1 /bin/sync
      1 /bin/sh

ฉันคิดว่ามันอธิบายทุกอย่างในคำตอบดั้งเดิม หากคุณยังไม่ชัดเจนเกี่ยวกับรายละเอียดของคำสั่งเหล่านั้นคุณสามารถอ่านหน้าคู่มือได้ หากคุณยังไม่ชัดเจนในหลักการของสิ่งที่เกิดขึ้นคุณควรเริ่มต้นด้วยการอ่านหนังสือ (ออนไลน์หรือบนกระดาษ) อธิบาย Unix และ Linux


คุณช่วยอธิบายเพิ่มเติมอีกหน่อยได้ไหม? ฉันไม่แน่ใจว่าฉันทำตามสิ่งที่ฉันกำลังอ่าน
Captain Man

เป็น/bin/syncเปลือก? ยูทิลิตี้ใดเป็นเชลล์?
eloone

@eloone มีความหมายสองอย่าง (อาจสาม) สำหรับ "shell" หนึ่งคือโปรแกรมกำหนดค่าเป็นเปลือกเข้าสู่ระบบในฐานข้อมูลรหัสผ่าน นี่คือความหมายของคำที่มีขึ้นโดยวลี "เชลล์ล็อกอินที่ไม่โต้ตอบ" ความหมายอื่นคือ "REPL ที่เหมาะสมสำหรับการทำงานแบบโต้ตอบทุกวันในระบบ Unix" เหล่านี้เป็นแบบโต้ตอบ อย่างไรก็ตามโปรแกรมส่วนใหญ่ที่ใช้งานได้ในบริบท REPL ยังสนับสนุนการใช้ที่ไม่ใช่แบบโต้ตอบในฐานะล่ามสำหรับภาษาสคริปต์บางประเภท (แม้ว่า "เชลล์สคริปต์" เกือบทุกภาษาจะหมายถึง
James Youngman

2
คุณดูเหมือนจะตอบคำถามอื่น คุณเพียงแค่แสดงรายการเชลล์ที่มีอยู่และชี้ให้เห็นว่าบางอันจะไม่สามารถโต้ตอบได้ ฉันเชื่อว่า OP กำลังถามว่าเชลล์การเข้าสู่ระบบแบบไม่โต้ตอบเคยพบเจอในป่าหรือไม่ ดังนั้นไม่ว่าเชลล์ที่สามารถโต้ตอบได้หรือไม่ก็ต้องทุบตีเช่นเคยเปิดตัวเชลล์ล็อกอินที่ไม่โต้ตอบ ในคำอื่น ๆ เป็น "การเข้าสู่ระบบเปลือก" ที่นี่ไม่ได้หมายความว่า "เริ่มต้นเปลือกเข้าสู่ระบบของผู้ใช้" ก็หมายความว่าเปลือกซึ่งได้รับการเปิดตัวเป็นเปลือกเข้าสู่ระบบ ดูunix.stackexchange.com/a/46856/22222
terdon

1
หรือบางทีอาจเป็นเพราะผู้โพสต์เขียนไว้อย่างชัดเจนbash --loginในคำถามเขาถามเฉพาะเกี่ยวกับbashกระบวนการที่ไม่มีiชุดตัวเลือก (สิ่งนี้เกิดขึ้นจากคำสั่งเช่นssh somehost < script.shนี่จะเป็นเชลล์ "ล็อกอินไม่ใช่แบบโต้ตอบ" ในความรู้สึกที่ระบุไว้ในส่วนINVOCATIONของ Bash manpage)
cjs
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.