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

Mic*_*ann 17 centos terminal virtualbox bash grub

这可能是一个重复的问题,但我对 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并解决这个烂摊子?

Cha*_*rge 24

您可以使用实时 Linux CD 启动,然后挂载 CentOS 文件系统,并从那里编辑 .bashrc 文件。

  • 最简单的解决方案。也适用于阻止登录甚至完全启动的错误配置(只要你知道什么是错误的以及如何扭转它。) (2认同)

lex*_*lex 15

从 grub 配置初始化 /bin/sh

您可以编辑您的 grub 配置来加载一个 root shell,而不是进入 GUI。

  1. 重启你的虚拟机
  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
    
    Run Code Online (Sandbox Code Playgroud)
  4. roto rwreadonly标志更改为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
    
    Run Code Online (Sandbox Code Playgroud)
  5. 按 Ctrl-X 运行配置。它不会被保存。

  6. 将出现一个 root shell。使用它来编辑.bashrc和删除违规行。

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

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

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

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

  • @MichaelHoffmann 这是一种标准的、众所周知的获取 root 的方式——你必须用密码保护引导加载程序来阻止它。它会导致内核恐慌,因为 init 永远不应该退出,否则恐慌是无害的。您可以通过 `exec /sbin/init` 或任何实际的 `init` 继续引导。`ro` 和 `rw` 选项以只读或读写方式挂载 root。您实际上是在编辑 GRUB 菜单以告诉它使用这些选项引导 Linux,这些选项告诉 Linux 以读写方式挂载根文件系统并为 init 启动 sh。 (5认同)

mur*_*uru 13

CtrlAltF1可能被主机捕获,或者 VirtualBox 可能没有正确传递它。一些快速测试告诉我,您可以使用VirtualBox 中定义的Host键而不是CtrlAlt(可以是 left Ctrl,或?Mac 上的 left )。因此,按下 ?F1切换到 VirtualBox 中的 TTY1 对我来说(对于?F7返回 GUI 也是如此)。

  • @MichaelHoffmann 是的,这将是比我新的 CentOS 的影响。GDM 行为在 6 和 7 之间更改为使用第一个可用的 TTY 而不是 TTY 7。 (2认同)
  • 在未来的版本中它会进一步改变:登录屏幕将在 vconsole 1 上,每个登录的图形用户将占用每个后续的 vconsole(当您登录时,您的会话在 vconsole 2 上,如果您进行用户切换,下一个用户将是在 vconsole 3 等上)。 (2认同)

gws*_*gws 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
Run Code Online (Sandbox Code Playgroud)

附录:正如 OP 在下面指出的那样,这需要 SSH 访问homehost. 如果这不是一个选项,但可以使用 FTP/SFTP,则任何文件传输方法都可以满足您的需求,只需安装更正的登录文件即可。