ทำให้เปลือกเริ่มต้น zsh โดยไม่ต้องเข้าถึงราก


52

ฉันกำลังใช้เครื่องคอมพิวเตอร์โรงเรียนของฉันและต้องการที่จะใช้แทนzsh bashฉันต้องการที่จะทำให้มันเป็นเปลือกเริ่มต้น แต่ฉันไม่สามารถเรียกใช้คำสั่งเช่น$ chsh -s $(which zsh)เพราะฉันไม่มีสิทธิ์ของผู้ดูแลระบบ

มีวิธีที่ฉันสามารถวางบางสิ่งบางอย่างในของฉัน.bashrcหรือสิ่งที่เรียกโดยอัตโนมัติzshเมื่อมันเปิดเป็นวิธีแก้ปัญหา?

เพื่อชี้แจงzshมีการติดตั้งแล้ว


2
ใช่เพียงแค่เพิ่มzshใน.bashrcไฟล์ ออกจากระบบและเข้าสู่ระบบและทำ!
fedorqui

ขอโทษสำหรับเรื่องนั้น. แต่เพื่อตอบคำถามฉันแค่ใส่zshบรรทัดแรก?

3
การวาง zsh ใน. bashrc จะทำให้มันดำเนินการเสมอแม้ว่าbashจะถูกเรียกอย่างชัดเจน ดีกว่าวางไว้ใน.bash_profileแทน
konsolebox

คุณสามารถตั้งค่า zsh เป็นเชลล์เริ่มต้นในการตั้งค่าเทอร์มินัล (สร้างโปรไฟล์ใหม่)
lmaooooo

คำตอบ:


68

สร้าง.bash_profileในโฮมไดเร็กทอรีของคุณและเพิ่มบรรทัดเหล่านี้:

export SHELL=/bin/zsh
exec /bin/zsh -l

อัปเดต: .profileอาจทำงานเป็นโซลูชันทั่วไปเมื่อเชลล์เริ่มต้นไม่ได้ถูกทุบตี ฉันไม่แน่ใจ.profileว่า Zsh อาจถูกเรียกเช่นนั้นซ้ำซ้อนหรือไม่ แต่เราสามารถทำได้อย่างปลอดภัยด้วยการตรวจสอบง่ายๆ:

export SHELL=/bin/zsh
[ -z "$ZSH_VERSION" ] && exec /bin/zsh -l

นอกจากนี้เรายังสามารถใช้whichเพื่อรับเส้นทางแบบไดนามิกzshซึ่งขึ้นอยู่กับค่าของ$PATH:

export SHELL=`which zsh`
[ -z "$ZSH_VERSION" ] && exec "$SHELL" -l

จะเป็นอย่างไรถ้าผู้ดูแลระบบ Linux (รูท) เปลี่ยนเชลล์เริ่มต้นของคุณเป็นอย่างอื่นที่ไม่ใช่ bash (แต่ไม่ใช่ zsh) เช่น ksh? จากนั้น.bash_profileจะไม่ได้รับการอ้างอิง แล้วเอามันมา.profileแทนล่ะ
Joshua Huber

@JoshuaHuber การทดสอบครั้งสุดท้ายที่ฉันทำ.profileไม่ได้ผล นอกจากนี้ยังจะไม่.profileถูกเรียกด้วยZsh? มันสามารถไปซ้ำซ้อน ยังไม่ได้ตรวจสอบว่า (ปรับปรุง: มันไม่ทำงานตอนนี้ไม่แน่ใจว่าสิ่งที่ผมทำผิดพลาดก่อน.) คิดใด ๆ เกี่ยวกับข้อบกพร่องที่เป็นไปได้กับการใช้.profile?
konsolebox

1
@konsolebox ทุบตีเฉพาะใน.profileกรณีที่.bash_profileไม่มี (เว้นแต่ว่าคุณจะได้รับจากแหล่งด้วยตนเอง.bash_profileแน่นอน) โดยเฉพาะแหล่งที่มาทุบตีคนแรกของไฟล์ [ .bash_profile> .bash_login> .profile] พบ มันจะมอง.profileว่าเป็นคุณสมบัติที่เข้ากันได้กับ POSIX (เชลล์เป้าหมาย) เท่านั้น
pyrocrasty

@pyrocrasty แน่นอน ดังที่ได้กล่าวไว้ในคู่มือ: "หลังจากอ่านไฟล์นั้นแล้วมันจะมองหา ~ / .bash_profile, ~ / .bash_login และ ~ / .profile ตามลำดับและอ่านและเรียกใช้คำสั่งจากไฟล์แรกที่มีอยู่และอ่านได้ ."
konsolebox

มันทำงานสำหรับการตั้งค่าโปรไฟล์ขั้วใหม่ที่มีการเรียกใช้คำสั่งที่กำหนดเองแทนจากเปลือกของฉันzshเปลี่ยนไป .bash_profileและใช้งาน.profileไม่ได้ (ไฟล์ไม่ได้ถูกเรียกใช้แม้แต่ Fedora 26 บนคอมพิวเตอร์มหาวิทยาลัย)
lmaooooo

12

โดยปกติคุณสามารถใช้chshเป็นผู้ใช้ที่ไม่ใช่รูท แต่บางครั้งก็ถูกปิดใช้งานโดยปกติจะอยู่ในไซต์ที่ใช้ฐานข้อมูลผู้ใช้เครือข่ายบางรูปแบบเช่น NIS และ LDAP อาจมีypchsh(NIS) หรือchsh.ldap(LDAP) แทน

chshยังมักจะอนุญาตให้เฉพาะบางส่วนได้รับการอนุมัติ/etc/shellsหอยมักจะเป็นคนที่อยู่ใน

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

  • ถ้าเปลือกเข้าสู่ระบบของคุณsh, dashหรือไฟล์ที่คุณต้องการที่จะแก้ไขคือksh ~/.profileระวังว่าไฟล์นี้จะถูกอ่านที่จุดเริ่มต้นของเซสชั่นการโต้ตอบเช่นเดียวกับสคริปต์เริ่มต้นเซสชั่นที่ไม่ใช่แบบโต้ตอบ (เช่นสำหรับช่วง X11) ดังนั้นคุณต้องดูแล: โทรเท่านั้นexec(ซึ่งแทนที่กระบวนการปัจจุบัน) เมื่อปัจจุบัน เชลล์เป็นแบบโต้ตอบ ยกเว้นเชลล์เป้าหมาย ( /bin/shของ Solaris 10 และก่อนหน้า) คุณสามารถบอกได้ว่าเชลล์นั้นมีการโต้ตอบโดยการมีอยู่iในรายการตัวเลือก ( $-)

    preferred_shell=
    if [ -x /bin/zsh ]; then
      preferred_shell=/bin/zsh
    fi
    
    if [ -n "$preferred_shell" ]; then
      case $- in
        *i*) SHELL=$preferred_shell; export SHELL; exec "$preferred_shell";;
      esac
    fi

    หากคุณต้องการ zsh อ่านของคุณ.zprofileผ่าน-lตัวเลือก

  • หากเชลล์ล็อกอินของคุณคือbashคุณสามารถดำเนินการตามข้างต้น ~/.bash_profileหรือคุณอาจจะใส่คำสั่งเหล่านี้ใน สคริปต์การเริ่มต้นเซสชันส่วนใหญ่จะอ่าน~/.profileและไม่อ่านเท่านั้น~/.bash_profileแต่ฉันเคยเห็นบางอย่างที่ทำงานภายใต้การทุบตีและอ่าน.bash_profileดังนั้นแม้คุณจะต้องระวังไม่ให้โทรexecในเชลล์ที่ไม่ต้องมีการโต้ตอบ

  • หากล็อกอินเชลล์ของคุณคือ csh หรือ tcsh ให้ดูตัวอย่างในการเปลี่ยนเชลล์เริ่มต้นโดยไม่มี chsh หรือสิทธิพิเศษผู้ดูแลระบบ


1

ฉันเชื่อว่าคำสั่งchshมีไว้เพื่อจุดประสงค์นี้ แม้ว่าฉันไม่แน่ใจว่า Linux / Unix distro ทุกตัวรองรับสิ่งนั้น chshตรวจสอบหน้าคนของ


บางระบบก็มีเหมือนpasswd -sกัน
Stéphane Chazelas

1

หากคุณไม่สามารถทำงานได้chshเพราะคุณไม่ได้มีสิทธิ์ผู้ดูแลระบบ, พูดคุยกับคนที่ไม่

เป็นไปได้ว่าคุณไม่สามารถใช้chshเป็น non-root ได้เนื่องจากมีการกำหนดค่าระบบที่คุณใช้เพื่อให้ใช้chshงานไม่ได้ตัวอย่างเช่นเนื่องจากระบบใช้ NIS หรือ LDAP แทนที่จะเป็น/etc/passwdไฟล์ หรือบางทีผู้ดูแลระบบของคุณแค่ต้องการควบคุมบางอย่าง

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

คำตอบอื่น ๆ ส่วนใหญ่ดี แต่ถ้าผู้ดูแลระบบของคุณตอบสนองอย่างสมเหตุสมผลคุณอาจไม่ต้องการแฮ็คสคริปต์เริ่มต้นของคุณ ฉันอาจจะเรียกใช้zsh -lด้วยตนเองหลังจากลงชื่อเข้าใช้จนกว่าผู้ดูแลระบบจะได้รับการอัปเดตบัญชีของฉัน

สิ่งที่ควรทราบ: บางครั้งเชลล์ที่แตกต่างกันสามารถใช้ไฟล์เริ่มต้นเดียวกันได้ ยกตัวอย่างเช่นshและbashทั้งสองสามารถดำเนินการ$HOME/.profileและcshและtcshทั้งสามารถดำเนินการ$HOME/.loginและ$HOME/.cshrc(แม้ว่าเปลือกเฉพาะแฟ้มเริ่มต้นเหมือน.bashrc, .bash_profileและ.tcshrcสามารถแทนที่เหล่านั้น) หากเชลล์เริ่มต้นของคุณคือ/bin/cshและคุณต้องการใช้การ/bin/tcshอัปเดต.loginเพื่อเรียกใช้ของคุณ/bin/tcsh -lสามารถสร้างวงวนไม่สิ้นสุด zshไม่ได้เกิดขึ้นกับการเรียกใช้bashงาน - ไฟล์เริ่มต้นเฉพาะดังนั้นจึงไม่ใช่ปัญหาสำหรับคุณ

เปลือกหอยส่วนใหญ่ตั้งค่าตัวแปรที่ระบุว่าเปลือกคุณกำลังใช้งาน ( $BASH_VERSION, $tcsh, $ZSH_VERSION) หากคุณกำลังจะเขียนรหัสเริ่มต้นเพื่อเรียกใช้เชลล์ที่คุณต้องการคุณไม่ควรใส่มันในกรณีที่ifมันไม่ได้ทำงานอยู่ในกรณีที่คุณไม่ได้ใช้เชลล์นั้น ใช้รหัสจากคำตอบของ konsolebox :

if [ "${ZSH_VERSION:-unset}" = "unset" ] ; then
    export SHELL=/bin/zsh
    exec /bin/zsh -l
fi

(ความซับซ้อนที่เพิ่มขึ้นของการตรวจสอบ"${ZSH_VERSION:-unset}"แทนที่จะ"$ZSH_VERSION"อนุญาตให้มีความเป็นไปได้ที่คุณได้ทำไปset -o unsetแล้วตัวเลือกที่ทำให้การอ้างอิงถึงตัวแปรที่ไม่ได้กำหนดเป็นข้อผิดพลาด)


1

ฉันสามารถนึกถึงสถานการณ์บางอย่าง

  1. zshไม่ได้อยู่ใน/etc/shellsและ OP ต้องการใช้งานโดยไม่ต้องพิมพ์zshที่ command prompt การแก้ปัญหาที่เป็นไปได้.

    a) ใช้เทคนิคการใช้โพรไฟล์เพื่อเรียกใช้งานในการเข้าสู่ระบบ สิ่งนี้มีประสิทธิภาพเท่ากับการเปลี่ยนเชลล์จริง

    ข) ขอให้ผู้ดูแลระบบเพื่อเพิ่มzshการ/etc/shellsเพื่อให้คุณสามารถchshไป

    c) ขอให้ผู้ดูแลระบบเปลี่ยนเชลล์ของคุณ มันไม่ฉลาดเพราะมันจะทำให้คุณสูญเสียความสามารถftpในการคุณสามารถใช้งานได้ก็ต่อftpเมื่อคุณมีเปลือกหอย/etc/shells

  2. ผู้ใช้มีความประสงค์ที่จะหลบหนีเปลือก จำกัด ส่วนใหญ่มีแนวโน้มหรือrbashrsh

    หาก.profileสามารถแก้ไขได้PATHสามารถขยายได้โดยการแก้ไข เมื่อ/binอยู่ในพา ธ แล้วคุณสามารถเริ่มต้นbashจากภายในrsh/rbashเข้าสู่chshคำสั่งเพื่อให้คุณเปลี่ยนเชลล์ได้ คำสั่งจำนวนมากมีการยกเว้นเชลล์ซึ่งสามารถใช้เพื่อหลีกเลี่ยงเชลล์ที่ จำกัด และเข้าถึงchshได้อีกครั้ง

  3. chshใช้งานไม่ได้เพราะเหตุผลอื่น ทางออกจากความเป็นไปได้ที่ 1 คือคำตอบที่นี่เช่นกัน

สถานการณ์ที่ 2 เป็นเหตุผลเดียวที่ทำให้เปลี่ยนเปลือกเริ่มต้นจริง ๆ (มัน จำกัด มากเกินไป)


-3

ฉันไม่คิดว่าคำตอบที่ให้ไว้จริง ๆ ทำให้zshเชลล์เริ่มต้น มันเปลี่ยนแปลงง่ายเปลือกเพื่อ zsh เร็วที่สุดเท่าที่ใช้บันทึกในการของเขา / เธอเริ่มต้นเปลือก ผู้ใช้จะยังคงเข้าสู่ระบบDEFAULT SHELLแต่ด้วยสิ่งนี้เชลล์จะเปลี่ยนเป็นzsh

ในการเปลี่ยนเชลล์เริ่มต้นให้ใช้:

usermod -s /path/to/shell username 

คุณควรเป็นคนรูท

มิฉะนั้นวิธีแก้ปัญหาข้างต้นจะมีประโยชน์

เพิ่มจากความคิดเห็น

chsh -s /path/to/zsh  # considered as standard as compared to usermod

และสามารถเรียกใช้โดยผู้ใช้สำหรับเขา / เธอ


4
คำถามค่อนข้างชัดเจนว่าการแก้ไขฐานข้อมูลผู้ใช้ระบบ (บิตที่คุณต้องการรูทต้องทำในคำตอบนี้) ไม่ใช่ตัวเลือก
Caleb

3
chsh -s /path/to/zshเป็นมาตรฐานมากขึ้นและโดยปกติ (แต่ไม่เสมอไป) ไม่จำเป็นต้องเข้าถึงรูทusermodซึ่งต่างจากที่เคยทำ ดังนั้นคำตอบของคุณจึงมีปัญหามากกว่าคำถามที่ว่าแล้วไม่ทำงาน
Gilles 'SO- หยุดความชั่วร้าย'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.