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_shell
on
.profile
หรือเทียบเท่า) และ 2 มันเป็นเปลือกที่ควรจะเริ่มต้นที่เข้าสู่ระบบ ผู้ใช้ตามที่กำหนดไว้ใน/etc/passwd
หรือเทียบเท่า$SHELL
มีหลังการshopt
ส่งออกของคุณจัดการกับอดีต โดยทั่วไปเมื่อเชลล์ใน (2) เริ่มต้นที่ล็อกอินมันจะเริ่มในวิธีที่เฉพาะเจาะจงสำหรับ (1) ดังนั้นการรวมค่าความหมาย