ฉันจะใช้ทุบตีเป็นเปลือกเข้าสู่ระบบของฉันได้อย่างไรเมื่อระบบของฉันปฏิเสธที่จะให้ฉันเปลี่ยนมัน


38

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

( chshติดตั้งบนเครื่องเหล่านี้ แต่เราใช้คีย์สาธารณะ / ส่วนตัวสำหรับการเข้าสู่ระบบและฉันไม่มีรหัสผ่านดังนั้นเมื่อchshแจ้งรหัสผ่านให้ฉันฉันไม่มีอะไรจะให้)

คำตอบ:


69

เมื่อคุณล็อกอินไฟล์~/.profileจะถูกอ่านโดยเชลล์ล็อกอิน (ksh สำหรับคุณ) คุณสามารถสั่งให้เชลล์ล็อกอินนั้นแทนที่ตัวเองด้วยการทุบตี คุณควรใช้ความระมัดระวัง:

  • แทนที่เชลล์ล็อกอินเท่านั้นหากเป็นแบบโต้ตอบ สิ่งนี้มีความสำคัญ: มิฉะนั้นการเข้าสู่ระบบในโหมดกราฟิกอาจไม่ทำงาน (ขึ้นอยู่กับระบบ: บางระบบ แต่ไม่ทุกระบบอ่าน~/.profileเมื่อเข้าสู่ระบบผ่าน xdm หรือคล้ายกัน) และสำนวนต่าง ๆ เช่นssh foo '. ~/.profile; mycommand'จะล้มเหลว
  • ตรวจสอบว่ามีการทุบตีเพื่อให้คุณยังสามารถเข้าสู่ระบบหากปฏิบัติการไม่ได้มีด้วยเหตุผลบางอย่าง

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

นอกจากนี้ยังตั้งค่าSHELLตัวแปรสภาพแวดล้อมเป็น bash ดังนั้นโปรแกรมเช่นเทอร์มินัลอีมูเลเตอร์จะเรียกใช้เชลล์นั้น

นี่คือรหัสเพื่อเปลี่ยนเป็นทุบตี ~/.profileวางไว้ในตอนท้ายของ

case $- in
  *i*)
    # Interactive session. Try switching to bash.
    if [ -z "$BASH" ]; then # do nothing if running under bash already
      bash=$(command -v bash)
      if [ -x "$bash" ]; then
        export SHELL="$bash"
        exec "$bash"
      fi
    fi
esac

17
คำตอบที่ยอดเยี่ยม! stackexchange ต้องการปุ่มSend A Beer : นี่เป็นเวลาที่ฉันจะใช้
iconoclast

ขอบคุณก่อนและ .profileใช้งานได้กับล็อกอินเชลล์เท่านั้น (ตามต้องการ OP) ฉันใช้การเชื่อมต่อเดสก์ท็อประยะไกลของ Windows 10 เพื่อลงชื่อเข้าใช้เวิร์กสเตชัน Linux จากนั้นเปิด Terminal ใน gnome ฉันต้องการในขณะที่ดูแลระบบของฉันให้ฉันzsh bashในกรณีนี้ผมต้องเพิ่มข้อมูลในแทน.bashrc .profile
สุดสัปดาห์

12

นี่เป็น kludge เล็กน้อย แต่คุณสามารถทำให้bashเป็นเชลล์ที่คุณใช้เมื่อเข้าสู่ระบบโดยการสร้าง.profileไฟล์ในโฮมไดเร็กตอรี่ของคุณที่มี

SHELL=`type -P bash`
exec bash -l

นี่จะทำให้kshเซสชันถูกแทนที่ด้วยbashเซสชัน คุณจะไม่ต้องพิมพ์exit(หรือ^D) สองครั้งเหมือนที่คุณทำหากคุณเริ่มbashเซสชันใหม่ด้วยตนเองทุกครั้งที่คุณลงชื่อเข้าใช้และพิมพ์

echo $SHELL

bashแม้จะกลับเส้นทางไปยัง


3
แน่นอนคุณสามารถเปลี่ยน $ SHELL ได้อย่างง่ายดายโดยเพิ่มบรรทัดที่ต้องทำก่อนที่ผู้บริหาร
Derobert

2
exec bash -lหากคุณต้องการเปลือกใหม่ยังจะเข้าสู่ระบบเปลือกคุณควรอาจจะ
jw013

1
หนึ่งความคิดเห็นล่าสุด: typeจะแนะนำwhichมากกว่า
jw013

1
ฉันไม่เข้าใจ! จะไม่bashอ่าน.profileเช่นนั้นด้วยการสร้างวงวนไม่สิ้นสุด? ฉันยอมรับว่าบางสิ่งในสายของexec bashคือสิ่งที่คุณต้องการ แต่คุณต้องแน่ใจว่าคุณทำกับ ksh ล็อกอินของคุณเท่านั้นดังนั้นหากจำเป็นต้องมีคำสั่ง!
Bananguin

1
@ user1129682 ไม่ใช่ถ้ามี~/.bash_profileหรือ~/.bash_login
Ulrich Dangel

4

คำตอบของไจล์สควรมีการเพิ่มแฟล็ก -l เมื่อเรียกใช้งาน bash ดังนั้นสคริปต์โปรไฟล์การเข้าสู่ระบบใด ๆ จะถูกจัดหาใน bash เชลล์ใหม่ (ตัวอย่างเช่นทุกสิ่งใน /etc/profile.d/ บน RHEL) สคริปต์ควรเป็น:

case $- in
  *i*)
    # Interactive session. Try switching to bash.
    if [ -z "$BASH" ]; then # do nothing if running under bash already
      bash=$(command -v bash)
      if [ -x "$bash" ]; then
        export SHELL="$bash"
        exec "$bash" -l
      fi
    fi
esac

คุณช่วยอธิบายเหตุผลที่คุณพูดเพื่อเพิ่ม-lตัวเลือกได้หรือไม่ ฉันใช้สิ่งนี้มาหลายเดือนโดยไม่มีปัญหาเลย
cokedude

1

คำตอบสำหรับcsh/tcshแรงบันดาลใจจากผู้ที่ได้รับการโหวตสูงสุดโดย @Gilles คือ

if ( ! $?BASH ) then
  setenv BASH `command -v bash`
endif

if ( $?prompt ) then
  if ( -x "$BASH" ) then
    exec "$BASH"
  endif
endif

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