เปลี่ยน sudo su shell


13

เมื่อใดก็ตามที่ฉันเรียกใช้sudo suจากปกติของฉันzsh(ซึ่งใช้เฟรมเวิร์กoh-my-zsh ) ฉันถูกบังคับให้ใช้เชลล์เป้าหมายเก่า ( sh) โดยค่าเริ่มต้น (ชัด ๆ นี่เป็นพฤติกรรมมาตรฐานในระบบที่เหมือน * nix) ถ้าฉันวิ่งzshจากภายในshหลังจากวิ่งsudo suฉันจะได้เปลือก Z แต่ไม่มีการปรับปรุงจาก oh-my-zsh

มีวิธีใดบ้างที่จะเปลี่ยนการsudo suเปิดตัวเชลล์เป็นzsh? ถ้าเป็นเช่นนั้นก็เป็นไปได้ยังมีตัวอย่างของzshการเปิดตัวโดยใช้oh-my-zsh?

ฉันใช้ OS X 10.8.4

คำตอบ:


21

อีกวิธีในการรันเชลล์เชิงโต้ตอบในฐานะ superuser คือsudo -sซึ่งใช้$SHELLเป็นเชลล์

ตามความคิดเห็นในคำตอบอื่น ๆ ที่กล่าวถึงsu -s /path/to/zshไม่ทำงานใน OS X

OS X ไม่รองรับการเปลี่ยนเชลล์การเข้าสู่ระบบ/etc/passwdด้วย แต่คุณสามารถใช้dscl:

$ dscl . -read /Users/root UserShell
/bin/sh
$ sudo dscl . -change /Users/root UserShell /bin/sh /bin/zsh
$ dscl . -read /Users/root UserShell
/bin/zsh
$ sudo su
My-iMac# echo $0
zsh
My-iMac# exit
$ sudo dscl . -change /Users/root UserShell /bin/zsh /bin/sh
$ 

/bin/shไม่ใช่ Bourne shell อีกต่อไปสำหรับแพลตฟอร์มส่วนใหญ่ มันเป็นรุ่นทุบตีที่สอดคล้องกับ POSIXใน OS X และเส้นประใน Ubuntu


นี่คือสิ่งที่ฉันคิดว่าคำถามที่ต้องการ มันทำงานได้ดีสำหรับฉันอย่างแน่นอน ขอบคุณมาก! แก้ไขฉันเห็นสิ่งที่เขาต้องการตอนนี้ - ฉันไม่คิดว่านี่คือสิ่งที่เขาต้องการดังนั้นฉันจึงไม่สามารถ upvote อย่างเป็นธรรมสำหรับคำถามนี้ แต่ฉันคิดว่าคุณสมควรได้รับเหรียญอยู่ดี คุณมีคำตอบสำหรับคำถามของฉัน !
Wyatt8740

4

จากsumanpage มีสองวิธีที่คุณสามารถทำได้


วิธีแรกคือการใช้-sหรือ--shellตั้งค่าสถานะ (สมมติว่าคุณใช้ระบบปฏิบัติการที่ใช้ * NIX พร้อมกับเวอร์ชันsuที่รองรับอาร์กิวเมนต์นี้) ตามด้วยพา ธ ไปยังเชลล์ที่คุณเลือก ถ้าเปลือกผ่านไม่สามารถพบได้ย้อนกลับไปใช้วิธีการต่อไปนี้และความล้มเหลวที่จะพยายามที่จะเรียกsu/bin/sh

ตัวอย่างเช่นคุณสามารถบังคับsuให้เปิดตัวzsh(สมมติว่ามีอยู่ใน/bin/zsh) เป็น:

sudo su --shell /bin/zsh

วิธีที่สองคือการแก้ไขเปลือกเริ่มต้นที่ระบุไว้สำหรับrootผู้ใช้ ( ระวัง! ) ซึ่งสามารถทำได้โดยแก้ไขไฟล์/etc/passwdและเปลี่ยนเชลล์ที่ระบุสำหรับrootผู้ใช้ หากต้องการดูว่าเชลล์ใดที่ระบุโดยค่าเริ่มต้นคุณสามารถเรียกใช้คำสั่งต่อไปนี้ (สมมติว่า superuser เป็นรูท):

sudo grep root /etc/passwd 

root:x:0:0:root:/root:/bin/bashคำสั่งควรบางสิ่งบางอย่างเช่นการส่งออก คุณสามารถเปลี่ยน/bin/bash(หรืออะไรก็ตามที่ตั้งไว้ในระบบของคุณ) เพื่อชี้ไปที่zshแทน


3
ระวังเสมอเกี่ยวกับการเปลี่ยนเปลือกของรูท คุณไม่ต้องการอยู่ในโหมดผู้ใช้คนเดียวและมีรูทเชลล์ที่ต้องการ / usr เมื่อใช้งานไม่ได้ อย่างน้อยต้องแน่ใจว่าเชลล์ใหม่ของคุณไม่มีการพึ่งพาระบบไฟล์มากกว่าที่คุณกำลังแทนที่
Rich Homolka

เล่นsudo su -s /bin/zsh(หรือใช้--shell) su: illegal option -- sผลตอบแทน ฉันใช้ OS X 10.8.4 OS X ใช้คำสั่งต่างกันอย่างไร
จูลส์

@JulesMazur ผลลัพธ์ของcat /etc/shellsอะไร ในทางเทคนิคแล้วกระสุนที่ได้รับอนุญาตในไฟล์นั้นจะถูกเปิดใช้งานแม้ว่าsumanpage จะบอกว่าสิ่งนี้ไม่สำคัญว่าsuจะถูกเรียกโดย root หรือไม่: S
Breakthrough

cat /etc/shellsส่งคืน/bin/zshเป็นเชลล์ที่ยอมรับได้
จูลส์

2
@JulesMazur โปรดจำไว้ว่าให้รวมระบบปฏิบัติการของคุณเสมอเพื่อหลีกเลี่ยงความสับสนเช่นนี้
terdon

1

วิธีที่สะอาดกว่าที่จะปกป้องระบบของคุณในกรณีที่เชลล์ที่กำหนดเองของคุณถูกเป่าขึ้นมาคือการสร้าง. profile ในโฮมไดเร็กตอรี่ของรูท w /:

if [ -x /opt/local/bin/bash ]; then
    SHELL=/opt/local/bin/bash
    export SHELL
    exec /opt/local/bin/bash
else
    echo /opt/local/bin/bash not found using default shell of $SHELL
fi

เพียงเปลี่ยนพา ธ ไปยังเชลล์ที่คุณต้องการแทนที่จะทุบตี


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