如何在不登录的情况下编辑.bashrc


17

这可能是一个重复的问题,但是我对CentOS的登录/引导过程(尤其是在VM上)还不够熟悉,无法知道要搜索什么。

我在VirtualBox中运行CentOS 7。我不小心gnome-terminal~/.bashrc文件末尾附加了内容。因此,现在登录时会弹出一个终端窗口。该终端会话执行.bashrc,打开另一个窗口,依此类推,等等,我被无数gnome-terminal终端窗口淹没。

我试图在没有GUI登录的情况下登录到终端会话(因此gnome-terminal失败),但是如果没有GUI ,我无法启动它。我尝试使用此问题的答案,但未成功。我每次都会获得GUI登录:如何在CLI中启动CentOS?。还有另一种在启动时编辑grub配置的方法,还是从GUI登录名进入新终端实例的方法,例如Ubuntu中的Ctrl + Alt + F1?(是的,我尝试过。它要么在CentOS 7中不起作用,要么在VirtualBox VM中不起作用。)或者还有其他方法可以在没有GUI的情况下进行终端会话,以便我可以编辑我的.bashrc并解决这个问题?


4
sshd了对虚拟机?很多方法。1)以单用户模式启动(例如,在引导时输入,选择内核,按a,附加,输入...)2)如果在VM系统中运行sshd,则可以尝试复制.bashrc修改并将其复制回( scp,sftp rsync ...)。3)您可以以其他用户身份登录并执行su -... 4)从另一台计算机(甚至虚拟机)ssh user@host mv .bashrc bashrcToModify登录,然后可以进行记录,修改... 0)首先要在CTRL ALT F1VM上运行吗?
Hastur

2
当您说“意外地附加了gnome-terminal”时,这是怎么发生的?
mcfedr

@mcfedr我正在等待有人问XD。我误会了那.bashrc是什么。我以为它在登录时运行一次,但是每次启动任何Shell会话时都会运行一次。我希望每次登录时都弹出一个终端窗口,所以我做了echo 'gnome-terminal' >> ~/.bashrc。馊主意。我想我应该把gnome-terminal/etc/init.d或其他地方?我仍在尝试了解引导过程。
Michael Hoffmann

Answers:


13

CtrlAltF1可能被主机捕获,或者VirtualBox可能无法正确传递它。几个快速测试告诉我,您可以使用VirtualBox中定义的“ 主机”密钥代替CtrlAlt(可以是Mac上的left Ctrl或left )。因此,F1对我来说,在VirtualBox中按 切换到TTY1(对于F7返回GUI 同样如此)。


1
对。那行得通。Ctrl + F2帮了我大忙。看起来Ctrl + F1是CentOS中的GUI会话,但这是相同的原理。IMO,这是最简单的解决方案-无需额外的介质或编辑启动配置。我将其标记为答案。
Michael Hoffmann

2
@MichaelHoffmann是的,那将是比我更新的CentOS的效果。图6和7之间GDM行为改变为使用第一个可用的TTY TTY代替7.
穆鲁

2
在将来的版本中它将进一步变化:登录屏幕将位于vconsole 1上,并且每个登录的图形用户将占用随后的每个vconsole(登录时,会话位于vconsole 2上,如果用户切换下一个用户,则该用户将位于vconsole 2上)。在vconsole 3等上)。
迈克尔·汉普顿

24

您可以使用实时Linux CD进行引导,然后挂载CentOS文件系统,然后从那里编辑.bashrc文件。


2
最简单的解决方案。也适用于配置错误,以防止登录或什至完全引导(只要您知道问题出在哪里,以及如何将其撤消即可。)
alexis

这非常简单,尤其是在VirtualBox用户几乎可以保证有来宾OS的ISO存在的情况下。但是恐怕我必须选择大师的答案,因为它甚至更简单。感谢您的贡献。
Michael Hoffmann

15

从grub配置初始化/ bin / sh

您可以编辑grub配置以加载根shell,而不用转到GUI。

  1. 重新启动您的VM
  2. 当出现grub菜单时,选择第一个条目并按 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. 更改rorwreadonly标志为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并删除违规行。

    请注意,您不应在此状态下继续使用OS,因为外壳将以PID 1运行,通常为init进程保留。您可以手动继续进行初始化,exec /sbin/init但建议您仅重新启动

  7. 正常重启。您之前的更改将被忘记。

实际上,我们正在编辑从GRUB传递给Linux的引导选项,该选项告诉Linux以读写方式挂载根文件系统并启动/bin/shinit进程。

这对我使用Centos 7和VirtualBox 4.3.12有用


嗯...工作得很好(有点令人不安的是,有人可以对我的笔记本电脑执行此操作以获取没有凭据的root shell吗?)。但它引起了内核崩溃时,我退出了外壳,所以我不知道如果我能记住这为答案...你能解释一下为什么这个作品?什么rorw?还是更好,是否有linux16的联机帮助页?我在这是要干嘛?
Michael Hoffmann

5
@MichaelHoffmann这是获取根目录的一种标准的,众所周知的方式-您必须使用密码保护引导加载程序以阻止此操作。它会引起内核恐慌,因为init永远不会退出,但是恐慌是无害的。您可以继续启动,exec /sbin/init无论实际启动与否init。在rorw选项安装根只读或读写。您实际上是在编辑GRUB菜单,以使其通过这些选项引导Linux,这些菜单告诉Linux以读写方式挂载根文件系统,并为init启动sh。
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
sshd是可行的,但前提是虚拟机已在其上运行(我不确定CentOS在默认情况下会这样做),并且在VirtualBox中以及在主机和虚拟机中正确配置了网络。
Michael Hoffmann
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.