TL; DR :
- เชลล์การล็อกอินกำหนดไว้ที่ไหน? ใน
/etc/passwd.
- มี
sudo su/ sudo su -/ sudo -i/ sudo -sเดียวกันได้หรือไม่ ไม่พวกมันทั้งหมดวางไข่เปลือก แต่ต่างกันและในบริบทที่แตกต่างกัน
- อะไร
$SHELLทำอย่างไร /etc/passwdเพียงแค่บอกเปลือกเริ่มต้นของคุณเช่นเดียวกับใน
คำตอบจริง :
ก่อนอื่นสิ่งสำคัญคือต้องระบุว่าshoptเป็นการเฉพาะสำหรับทุบตี ตัวอย่างเช่นฉันเป็นmkshผู้ใช้เชลล์และไม่มีshoptเช่นkshนั้นไม่ได้
ถัดไปlogin_shellควรนำเสนอสิ่งที่แน่นอน จากman bash:
login_shell
เชลล์ตั้งค่าตัวเลือกนี้ ถ้ามันเริ่มต้นเป็นเปลือกเข้าสู่ระบบ
นั่นคือประเด็นสำคัญ sudo -iดังที่คุณทราบแล้วจากคำตอบก่อนหน้านี้ที่คุณอ่านควรจะจำลองการเข้าสู่ระบบครั้งแรก นั่นเป็นเหตุผลที่shoptรายงานlogin_shell on สำหรับตัวเลือกนี้ คิดว่าสิ่งนี้ราวกับว่าsudo -iบังคับให้เชลล์ต้องผ่านไฟล์ที่ควรจะปรากฏขึ้นเฉพาะในระหว่างกระบวนการเข้าสู่ระบบ (ซึ่งไม่ได้รับมาจากเปลือกโต้ตอบ)
ในกรณีอื่น ๆ คุณกำลังเรียกใช้อินสแตนซ์ของเชลล์อยู่แล้วดังนั้นจึงไม่สามารถเป็นเชลล์การเข้าสู่ระบบได้ตั้งแต่แรกและวัตถุประสงค์ของตัวเลือกนั้นแตกต่างกัน sudo -sเพียงแค่อ่าน$SHELL(ซึ่งมีไว้เพื่อแสดงเปลือกเริ่มต้นของคุณตามที่ตั้งไว้/etc/passwd) และเรียกใช้งานด้วยสิทธิ์พิเศษของรูท นี้จะเทียบเท่ากับการทำsudo $SHELLหรือsudo mkshหรือsudo bash(ไม่ว่าคุณจะเกิดขึ้นกับการใช้งาน)
จำได้ว่าฉันพูดถึงว่าฉันเป็นmkshผู้ใช้? ดูที่นี้:
$ bash --posix
bash-4.3$ sudo -s
[sudo] password for xieerqi:
DIR:/xieerqi|01:53|skolodya@ubuntu:
$ id
uid=0(root) gid=0(root) groups=0(root)
DIR:/xieerqi|01:53|skolodya@ubuntu:
$ echo $-
imsU
สิ่งที่คุณเห็นคือสิ่งที่sudo -sกระโดดลงมาจากเปลือกbashของฉันmkshพร้อมกับคุณสมบัติที่ฉันตั้งไว้ และแน่นอนเพราะมันไม่ใช่การกระทำการเข้าสู่ระบบเพราะbashมันจะรายงานว่าเชลล์นั้นกลับกลายเป็นอินสแตนซ์ของเชลล์ที่ไม่ใช่การเข้าสู่ระบบ อย่างไรก็ตามในกรณีของฉันคุณจะเห็นว่า$-ไม่มีตัวอักษรlอยู่ตรงนั้นซึ่งน่าจะอยู่ตรงนั้นถ้านั่นเป็นอินสแตนซ์เชลล์ล็อกอิน
ในที่สุดความคิดเดียวกันนำไปใช้และsudo su sudo su -หลังจากนั้นหนึ่งอินสแตนซ์ของเชลล์การเข้าสู่ระบบของเชลล์ (เช่นไฟล์เฉพาะที่จำเป็นสำหรับการเข้าสู่ระบบจะทำงาน) และหนึ่งในอดีตจะเกิดขึ้นเฉพาะกับเชลล์แบบโต้ตอบ (เช่นไฟล์การเข้าสู่ระบบจะไม่ทำงาน)
bash-4.3$ sudo su
[sudo] password for xieerqi:
root@eagle:/home/xieerqi# shopt login_shell
login_shell off
root@eagle:/home/xieerqi# exit
bash-4.3$ sudo su -
[sudo] password for xieerqi:
$ shopt login_shell
login_shell on
ดังนั้นในทางเทคนิคแล้วshopt login_shellไม่มีความสัมพันธ์$SHELLใด ๆ ทั้งสิ้น คิดแบบนี้: จุดประสงค์คือเพื่อแสดงให้เห็นว่าการทุบตีทำงานอย่างไร $SHELLควรสะท้อนให้เห็นถึงสิ่งที่คุณได้รับมอบหมาย/etc/passwdเท่านั้น
สำหรับความแตกต่างระหว่างล็อกอินเชลล์และเชลล์ที่ไม่ใช่ล็อกอินเชลล์นั้นถูกอธิบายโดย Gilles ที่ได้รับการยอมรับอย่างสูงบน unix.stackexchange.com ในคำตอบนี้
ความสนุกเพิ่มเติม
นี่คือสิ่งที่คุณสามารถลองได้ ดังที่คุณอาจทราบแล้วว่าเชลล์การเข้าสู่ระบบจะทำงาน.profile(และ.bashrcเนื่องจาก Ubuntu ได้.profile รับการกำหนดค่าให้ทำเช่นนั้น ) แต่นรกที่ไม่ได้ลงชื่อเข้าใช้จะทำงานเฉพาะ.bashrcไฟล์เท่านั้น ดังนั้นเราสามารถทดสอบechoว่าคำสั่งใดที่เรียกใช้ล็อกอินเชลล์และไม่ใช้และเราคาดหวังว่าจะมีสองบรรทัดechoสำหรับล็อกอินเชลล์และเพียงอันเดียวสำหรับที่ไม่ใช่ล็อกอิน
$ echo "echo 'hi,i am .profile'" >> .profile
$ echo "echo 'hi, i am .bashrc'" >> .bashrc
$ sudo -i
hi, i am .bashrc
hi,i am .profile
$ sudo su
hi, i am .bashrc
root@eagle:~# sudo su -
hi, i am .bashrc
hi,i am .profile
$ sudo -s
hi, i am .bashrc
root@eagle:~#
เหมาะสมเพียงพอกับผู้ที่มีสองเส้นของการส่งออกจะมีการตั้งค่าให้login_shellon
.profileหรือเทียบเท่า) และ 2 มันเป็นเปลือกที่ควรจะเริ่มต้นที่เข้าสู่ระบบ ผู้ใช้ตามที่กำหนดไว้ใน/etc/passwdหรือเทียบเท่า$SHELLมีหลังการshoptส่งออกของคุณจัดการกับอดีต โดยทั่วไปเมื่อเชลล์ใน (2) เริ่มต้นที่ล็อกอินมันจะเริ่มในวิธีที่เฉพาะเจาะจงสำหรับ (1) ดังนั้นการรวมค่าความหมาย