/bin/bash 的内容是什么,如果不小心覆盖了怎么办

Gar*_*pex 27 linux bash data-recovery kali-linux

我不小心用我打算放在 /bin 文件夹中的愚蠢脚本覆盖了 /bin/bash 文件。

如何取回该文件的内容?有没有办法可以在网上找到内容,然后将它们复制回来?考虑到终端在谈论“符号链接太多”时出现错误,我在这里有什么选择?

我仍然是这种事情的新手,我很感激我能得到的所有帮助。

编辑:我忘了提到我在 Kali 2.2 Rolling 上,它几乎是带有一些附加功能的 debian。

编辑 2:我也重新启动了机器,因为直到几天前我才意识到我的错误。这使得这变得相当困难。

Wil*_*ard 67

不要关闭你的机器。

你还有一个正在运行的shell吗?是bash吗?如果是这样,你很好。(但不要再这样做了。)

跑:

sudo cp /proc/$$/exe /bin/bash
Run Code Online (Sandbox Code Playgroud)

瞧,一切都很好。


由于评论中有人怀疑这是否有效:

sudo cp /proc/$$/exe /bin/bash
Run Code Online (Sandbox Code Playgroud)

  • 在任何情况下,在此之后,建议从您的发行版中重新安装 bash,例如获得正确的权限(某些 rootkit 猎人可能会对那里的更改感到惊讶),还可以恢复硬链接或符号链接(例如到 `/bin/sh` 或`rbash`) (19认同)
  • @GiacomoCatenazzi,实际上,这个方法保留了权限——这是 `root` 运行 `cp` 时的默认设置。不过,硬链接是一个好点。 (4认同)

Phi*_*pos 38

bash是一个 shell,可能是你的系统 shell,所以现在奇怪的事情发生了,而 shell 的一部分仍然在内存中。一旦您注销或重新启动,您将陷入更深的麻烦。

所以第一件事应该是把你的外壳改成安全的东西。看看你安装了哪些shell

cat /etc/shells
Run Code Online (Sandbox Code Playgroud)

然后将您的外壳更改为此处列出的其他外壳之一,例如

chsh -s /bin/dash
Run Code Online (Sandbox Code Playgroud)

更新,因为您已经重新启动:

您很幸运,现在启动过程不依赖于bash,因此您的系统启动时,您只是无法获得命令行。但是您可以启动一个编辑器来编辑/etc/passwd和更改行中的 shellroot/bin/bash/bin/dash。注销并重新登录。只是不要对该文件进行任何其他更改,否则您可能会完全弄乱您的系统。

然后尝试重新安装bash使用

apt-get --reinstall install bash
Run Code Online (Sandbox Code Playgroud)

如果一切顺利,您可以chsh回到bash.

最后:我认为,kali 是一个高度专业化的发行版,可能不适合不小心覆盖其外壳的人。由于这句话被称为粗鲁和刺耳,我应该补充说我是根据自己的经验写的。当我年轻的时候,我确实毁了我的系统,因为没有人告诉我避免以 root 身份乱搞。

  • @JamesKPolk 不,它一点也不苛刻。这是简单的真理。Kali 是专供*专家*使用的专业工具。他们甚至在他们的网页上[声明](https://docs.kali.org/introduction/should-i-use-kali-linux)。如果你不是专家,你真的没有必要运行 Kali。 (12认同)
  • 最后一句话很严厉...:) (7认同)
  • @MSalters 错位的引号 * 以 root 身份运行 *。这是两个错误。当然,第二个是以 root 用户而不是非特权用户的身份尝试复杂的管道。 (6认同)
  • @dr01:考虑到 bash 转义的工作方式,这可能是引用错位的问题。想想 `command > /bin/bash ...` 与 `command > (/bin/bash ...)`。 (3认同)
  • 最后一句是**不**苛刻。这是显而易见的事实。 (3认同)

Sco*_*ott 5

如果您可以登录,但无法打开终端或以其他方式访问 shell,但您可以通过 GUI 访问文件,请转到/bin,查找名称以sh(但不是.sh)结尾的文件并运行一个(通过双击或右键单击)。特别是,寻找以下内容:

  • sh
  • dash
  • ash
  • ksh?(或ksh后跟一个数字;例如,  ksh93
  • zsh
  • yash

或者,作为最后的手段,

  • tcsh?或者
  • csh

如果您可以运行 shell,请尝试Philippos 的回答

另一种方法是按照这些说明启动到单用户模式, 但指定init=/bin/sh(或其他 shell 之一)而不是init=/bin/bash.