进一步阅读

进一步阅读

这是 ”Linux 可以在没有 shell 的情况下工作吗?“但纯粹专注于去除外壳的机制,而不会受到其他问题的干扰。

考虑与那里相同的系统:Ubuntu Linux Server LTS 版本 16 具有定制系统,包含作为 systemd 服务运行的编译二进制文件,无需任何最终用户(或实际上是管理员)登录。

怎样去除贝壳?这样做会产生什么结果呢?移除《谍影重重》外壳?去除/bin/sh?这样的系统还能运行多少?

注意这个问题是不是关心为什么人们想要这样做,使用终端,如何保护系统,或者使用可以使用的命令逃离贝壳。这里的重点是贝壳、去除机制以及后果。

答案1

这是相当复杂的考虑。首先:

  • POSIX 标准又称为单一 Unix 规范,保证一致的系统将具有可调用的程序来sh实现特定的 Shell 语言。在任何给定的真实系统上,sh实际上都是真实 shell 之一,例如 Z shell、Almquist shell、Korn shell、Bourne Again shell 等等;通常会识别出它已被名称调用sh并在POSIX模式
  • 十多年前,Debian 和 Ubuntu 社区努力消除操作系统各个部分对 Bourne Again shell 提供的扩展的依赖,即使在 POSIX 模式下也是如此。指定为其解释器的脚本#!/bin/sh不要求依赖于所谓的巴什主义,相反,依赖 Bashism 的脚本必须明确声明 Bourne Again shell 作为它们的解释器,而不是sh
  • systemd 人员早在 2011 年就将消除使用 shell 脚本作为系统和服务管理的一部分作为他们的目标之一。

去除贝壳的方法有点简单。一个删除诸如ashbashposhmkshpdkshtcshdash等包;使用包管理工具,例如aptitude.困难的部分是其中两个被标记为“必要” -dashbash-,这意味着其他包可以假设它们的存在而无需显式声明对它们的依赖关系,并且按照包管理器的意愿有意删除它们并非易事,要求您跳过额外的障碍来确认您确实想要删除它们。

麻烦伴随着这样做的后果。

  • 感谢 Debian 和 Ubuntu 人员的工作,现在有脚本可以明确地声明#!/bin/bash为他们的脚本解释器。如果删除 Bourne Again shell,即使保留了 Debian Almquist shell,此类脚本也将无法工作。
  • 如果删除 Debian Almquist shell,依赖于 POSIX 一致 shell 的脚本将无法运行。
  • 如果删除 Debian Almquist shell,依赖于 POSIX 一致 shell 的编译程序将无法运行。此类程序执行诸如调用system()库函数或显式实用execvpe()程序之类的操作sh

因此:

  • 应用程序可能无法运行。是的,它们是用编译语言编写的,而不是 shell 脚本。这并不能阻止应用程序程序员快速分叉并到处执行奇怪的 shell 进程。
  • 系统程序可能无法运行。为了同样的原因。
  • 系统程序可能无法运行,因为它们实际上是 shell 脚本。
    • 从启动和关闭过程中消除 shell 脚本并不是完全的。许多服务仍然由 van Smoorenburg 脚本控制,如果没有解释它们rc就会失败。sh跑步

      systemctl 列表单位
      您在描述开头看到的所有带有“LSB:”或“SYSV:”的服务都需要 shell 解释器才能工作。类似地,有时(滥用)用作服务的程序(例如rabbitmq-servermysqld_safe)实际上是 shell 脚本。
    • 许多辅助程序和实用程序都是 shell 脚本。 Debian 的/lib/systemd/systemd-sysv-install只是一个例子。其他包括/usr/sbin/service,,/usr/sbin/invoke-rc.d甚至/bin/fgrep
  • 救援和紧急模式引导程序将不起作用。rescue.serviceemergency.service(从 Ubuntu 16 中的 systemd 版本开始)都使用/bin/sh.

进一步阅读

相关内容