วิธีแก้ไข. bashrc โดยไม่ต้องเข้าสู่ระบบ


17

อาจเป็นคำถามที่ซ้ำกัน แต่ฉันไม่คุ้นเคยกับกระบวนการเข้าสู่ระบบ / การบูตของ CentOS (โดยเฉพาะบน VM) เพื่อทราบว่าจะค้นหาอะไร

ฉันใช้ CentOS 7 ใน VirtualBox ฉันต่อgnome-terminalท้าย~/.bashrcไฟล์โดยไม่ตั้งใจ ดังนั้นตอนนี้หน้าต่างเทอร์มินัลจะปรากฏขึ้นเมื่อฉันเข้าสู่ระบบเทอร์มินัลเซสชันจะดำเนินการ.bashrcซึ่งเปิดหน้าต่างอื่น ฯลฯ และฉันก็ท่วมด้วยgnome-terminalหน้าต่างเทอร์มินัลมากมาย

ฉันกำลังพยายามเข้าสู่เซสชันเทอร์มินัลโดยไม่มีการเข้าสู่ระบบ GUI ( gnome-terminalล้มเหลวดังนั้น) แต่ฉันไม่สามารถเริ่มระบบได้หากไม่มี GUI ฉันลองใช้คำตอบสำหรับคำถามนี้โดยไม่ประสบความสำเร็จ ฉันได้รับการเข้าสู่ระบบ GUI ทุกครั้ง: จะบู๊ต CentOS ใน CLI ได้อย่างไร . มีวิธีอื่นในการแก้ไขการกำหนดค่าด้วงขณะบู๊ตหรือวิธีเข้าถึงอินสแตนซ์เทอร์มินัลใหม่จากการเข้าสู่ระบบ GUI เช่น Ctrl + Alt + F1 ใน Ubuntu หรือไม่ (ใช่ฉันลองแล้วมันไม่ทำงานใน CentOS 7 หรือไม่ทำงานใน VirtualBox VM) หรือมีวิธีอื่นที่ฉันสามารถรับเซสชันเทอร์มินัลโดยไม่มี GUI ดังนั้นฉันจึงสามารถแก้ไขได้.bashrcและแก้ไขระเบียบนี้


4
คือsshdขึ้นไปบน VM ที่? มีหลายวิธี 1) เริ่มต้นเป็นโหมดผู้ใช้คนเดียว (เช่นป้อน ณ เวลาบูตเลือกเคอร์เนลกด a ต่อท้ายเดี่ยวป้อน ... ) 2) หากในระบบ VM ของคุณเรียกใช้ sshd คุณสามารถลองคัดลอก.bashrcแก้ไขของคุณและคัดลอกกลับมา ( scp, sftp rsync ... ) 3) คุณสามารถเข้าสู่ระบบในฐานะผู้ใช้รายอื่นและทำsu -... 4) จากเครื่องอื่น (แม้กระทั่งเสมือนจริง) คุณสามารถทำการssh user@host mv .bashrc bashrcToModifyบันทึกปรับเปลี่ยน ... 0) ก่อนหน้านี้ทั้งหมดจะCTRL ALT F1ทำงานจาก VM หรือไม่
Hastur

2
เมื่อคุณพูดว่า "คำต่อท้ายคำพังเพยโดยไม่ตั้งใจ" เกิดขึ้นได้อย่างไร
mcfedr

@mcfedr ฉันรอใครซักคนที่จะถาม XD ฉันเข้าใจผิดว่า.bashrcเป็นอะไร ฉันคิดว่ามันทำงานครั้งเดียวเมื่อเข้าสู่ระบบ แต่มันทำงานทุกครั้งที่มีการเริ่มใช้งานเชลล์ ผมอยากหน้าต่าง terminal echo 'gnome-terminal' >> ~/.bashrcที่จะปรากฏขึ้นทุกครั้งที่ผมลงนามในดังนั้นฉันไม่ ความคิดที่ไม่ดี ผมคิดว่าผมควรใส่gnome-terminalใน/etc/init.dหรือบาง? ฉันยังคงพยายามที่จะเข้าใจกระบวนการบูต
Michael Hoffmann

คำตอบ:


13

CtrlAltF1อาจได้รับการจับโดยโฮสต์หรือ VirtualBox อาจไม่ผ่านอย่างถูกต้อง การทดสอบอย่างรวดเร็วสองสามอย่างบอกฉันว่าคุณสามารถใช้รหัสโฮสต์ที่กำหนดไว้ใน VirtualBox แทนCtrlAlt(อาจเป็นทางซ้ายCtrlหรือทางซ้ายบน Macs) ดังนั้นการกด F1เปลี่ยนเป็น TTY1 ใน VirtualBox สำหรับฉัน (และในทำนองเดียวกันสำหรับF7กลับไปที่ GUI)


1
ได้. ที่ได้ผล Ctrl + F2 หลอกลวงให้ฉัน ดูเหมือนว่า Ctrl + F1 เป็นเซสชัน GUI ใน CentOS แต่เป็นหลักการเดียวกัน IMO นี่เป็นทางออกที่ง่ายที่สุดโดยไม่จำเป็นต้องใช้สื่อพิเศษหรือแก้ไขการกำหนดค่าการบูต ฉันกำลังทำเครื่องหมายสิ่งนี้เป็นคำตอบ
Michael Hoffmann

2
@MichaelHoffmann ใช่ว่าจะเป็นผลกระทบของ CentOS รุ่นใหม่กว่าที่ฉันมี พฤติกรรม GDM เปลี่ยนไประหว่าง 6 และ 7 เพื่อใช้ TTY แรกที่มีให้แทน TTY 7
muru

2
มันมีการเปลี่ยนแปลงเพิ่มเติมในรุ่นอนาคต: หน้าจอเข้าสู่ระบบจะอยู่บน vconsole 1 และผู้ใช้แบบกราฟิกแต่ละคนที่เข้าสู่ระบบจะครอบครอง vconsole แต่ละอันในภายหลัง (เมื่อคุณเข้าสู่ระบบเซสชันของคุณจะอยู่บน vconsole 2 หากคุณเปลี่ยนผู้ใช้คนถัดไป บน vconsole 3 ฯลฯ )
Michael Hampton

24

คุณสามารถบูทด้วยลินุกซ์ซีดีสดจากนั้นติดตั้งระบบไฟล์ CentOS และแก้ไขไฟล์. bashrc จากตรงนั้น


2
ทางออกที่ง่ายที่สุด นอกจากนี้ยังใช้งานได้กับการกำหนดค่าผิดพลาดที่ป้องกันการเข้าสู่ระบบหรือแม้กระทั่งการบูตโดยสิ้นเชิง (ตราบใดที่คุณรู้ว่ามีอะไรผิดปกติและจะย้อนกลับอย่างไร)
alexis

นี่เป็นเรื่องง่ายมากโดยเฉพาะอย่างยิ่งที่ผู้ใช้ VirtualBox รับประกันค่อนข้างมากว่าจะมี ISO ของระบบปฏิบัติการเกสต์ แต่ฉันกลัวว่าฉันต้องเลือกคำตอบของ muruเพราะมันง่ายกว่า ขอบคุณสำหรับการสนับสนุน
Michael Hoffmann

15

เริ่มต้น / bin / sh จากการกำหนดค่าด้วง

คุณสามารถแก้ไขการกำหนดค่าด้วงของคุณเพื่อโหลดรูทเชลล์แทนที่จะไปที่ GUI

  1. รีบูต VM ของคุณ
  2. เมื่อเมนูด้วงปรากฏขึ้นให้เลือกรายการแรกแล้วกดeเพื่อแก้ไข หากไม่ปรากฏขึ้นให้รีสตาร์ทและกด Shift ค้างไว้ระหว่างการบู๊ต
  3. หาบรรทัดที่ขึ้นต้นด้วยหรือlinux16 linuxฉันมีลักษณะเช่นนี้ ของคุณอาจแตกต่างกันเล็กน้อย

    linux16 /vmlinuz-3.10.0-327.18.2.el7.x86_64 root=/dev/mapper/centos-root ro crashkernal=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet LANG=en_US.UTF8
  4. เปลี่ยนroไปrw( อ่านได้อย่างเดียวธงReadWriteเพื่อให้คุณสามารถเขียนการเปลี่ยนแปลง) และผนวกinit=/bin/shกับสาย สิ่งนี้บอกให้ linux ทำงาน/bin/shแทนinitเมื่อเริ่มต้น ตัวอย่างสำหรับการเข้าของฉัน

    linux16 /vmlinuz-3.10.0-327.18.2.el7.x86_64 root=/dev/mapper/centos-root rw crashkernal=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet LANG=en_US.UTF8 init=/bin/sh
  5. กด Ctrl-X เพื่อเรียกใช้การกำหนดค่า มันจะไม่ถูกบันทึกไว้

  6. เชลล์รูทจะปรากฏขึ้น ใช้มันเพื่อแก้ไขของคุณ.bashrcและลบบรรทัดที่ละเมิด

    โปรดทราบว่าคุณไม่ควรใช้ระบบปฏิบัติการต่อไปในสถานะนี้เนื่องจากเชลล์จะทำงานเป็น PID 1 ซึ่งโดยปกติจะสงวนไว้สำหรับinitกระบวนการ คุณสามารถเริ่มต้นด้วยตนเองต่อไปได้exec /sbin/initแต่ฉันแนะนำให้รีบูตเครื่อง

  7. รีบูตตามปกติ การเปลี่ยนแปลงก่อนหน้าของคุณจะถูกลืม

เรากำลังแก้ไขตัวเลือกการบูตที่ส่งผ่านไปยัง Linux จาก GRUB ซึ่งบอกให้ Linux ติดตั้งระบบไฟล์รูทอ่าน - เขียนและเริ่มต้น/bin/shสำหรับกระบวนการเริ่มต้น

สิ่งนี้ใช้ได้กับฉันโดยใช้ Centos 7 และ VirtualBox 4.3.12


อืม ... มันทำงานได้อย่างสมบูรณ์แบบ (และอาจจะรบกวนใครสักคนทำเรื่องนี้กับแล็ปท็อปของฉันเพื่อไปที่รูทเชลล์ที่ไม่มีหนังสือรับรอง) แต่มันทำให้เกิดความตื่นตระหนกของเคอร์เนลเมื่อฉันออกจากเชลล์ดังนั้นฉันไม่รู้ว่าฉันสามารถทำเครื่องหมายสิ่งนี้เป็นคำตอบได้หรือไม่ ... คุณช่วยอธิบายได้ไหมว่าทำไมมันถึงใช้งานได้? สิ่งที่ทำroและrw? หรือดีกว่ายังมี manpage สำหรับ linux16 หรือไม่? ฉันกำลังทำอะไรที่นี่
Michael Hoffmann

5
@MichaelHoffmann นี่เป็นวิธีมาตรฐานที่รู้จักกันดีในการรูท - คุณต้องใส่รหัสผ่านเพื่อป้องกัน bootloader เพื่อบล็อกสิ่งนี้ มันทำให้เกิดความตื่นตระหนกของเคอร์เนลเนื่องจาก init ไม่ควรออกจากโปรแกรม แต่ความตื่นตระหนกนั้นไม่เป็นอันตราย คุณยังคงสามารถบูตโดยexec /sbin/initหรืออะไรก็ตามที่เกิดขึ้นจริงinitคือ roและrwตัวเลือกการติดรากอ่านอย่างเดียวหรืออ่านเขียน คุณกำลังแก้ไขเมนู GRUB เพื่อบอกให้บูต Linux ด้วยตัวเลือกเหล่านี้ซึ่งบอกให้ Linux ติดตั้งระบบไฟล์รากอ่านและเขียนเพื่อเริ่มต้นสำหรับ init
muru

1
@muru ฉันได้เพิ่มความคิดเห็นของคุณลงในคำตอบเพื่อช่วยให้สิ่งต่าง ๆ ชัดเจนยิ่งขึ้น
lex

6

scp สำเนาของการซ่อมแซม.bashrcเข้าที่

หากคุณมีเครื่องอื่นใช้งานได้ให้คัดลอกไฟล์ที่เสียหายและแก้ไขปัญหาจากนั้นนำกลับมาที่เดิม วิธีนี้จะหลีกเลี่ยงการล็อกอินและเรียกใช้คำสั่งล็อกอินใด ๆ

user@backup ~ $ scp user@homehost:~/.bashrc busted.bashrc
user@backup ~ $ vim busted.bashrc # fix, fix
user@backup ~ $ scp busted.bashrc user@homehost:~/.bashrc
user@backup ~ $ rm busted.bashrc

ภาคผนวก: เป็น OP ชี้ให้เห็นด้านล่างนี้ต้อง SSH homehostสามารถเข้าถึง หากนั่นไม่ใช่ตัวเลือก แต่ FTP / SFTP พร้อมใช้งานแทนวิธีการถ่ายโอนไฟล์ใด ๆ จะทำสิ่งที่คุณต้องการซึ่งเพียงติดตั้งไฟล์ล็อกอินที่ถูกต้อง


1
มันใช้งานได้ แต่ถ้า VM sshdทำงานบนมัน (ซึ่งฉันไม่แน่ใจว่า CentOS ทำตามค่าเริ่มต้น) และหากเครือข่ายนั้นได้รับการกำหนดค่าอย่างถูกต้องกับ VirtualBox และในโฮสต์และใน VM
Michael Hoffmann
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.