为什么有些命令“不存在”?

为什么有些命令“不存在”?

我是一个相当新的 Linux 用户,我注意到有些命令只有超级用户才能使用 - 例如关机。当我知道有一条命令时,我经常感到困惑,试图执行它,却被告知它根本不存在 - 而我只需要成为 root 就可以执行它。

我的问题是,为什么这些命令不提示您没有足够的权限来运行它,或者提示您需要 root 权限?这有什么技术原因吗?还是这就是现状?

答案1

您可能看到的响应并不表示命令不存在,而是表示“未找到”它们:

telemachus ~ $ ifconfig -a
bash: ifconfig: command not found

有些错误消息是无用的,但这个消息实际上相对有用。单词“未找到”告诉您问题出在哪里。您的 shell(在我的情况下显然是 Bash)沿着其$PATH变量查找命令。PATH是一组以冒号分隔的值。每个值都是可执行(二进制)程序所在的目录,shell 沿着该目录链从左到右依次查找命令。以下是如何查看您的 PATH 是什么:

telemachus ~ $ echo $PATH
/home/telemachus/bin:/usr/local/bin:/usr/bin:/bin:/usr/games

(请注意,大小写很重要,PATH 都是大写的。大小写也很重要。)所以我的 shell 先在主文件夹的目录$中查找命令,然后在,然后在等等中查找。顺序很重要,因为有时你会有一个程序的两个版本,你想确保你首先找到一个特定的版本。(我的目录中的 Ruby 版本与系统范围内的版本不同,我希望首先找到它。)bin/usr/local/bin/usr/bin$HOME/bin

要将目录添加到 PATH,通常可以编辑 shell 的配置文件。根据您使用的 Linux 发行版,该文件将被称为.profile.bash_profile,并且将位于您的主目录中。以 开头的文件.(通常称为点文件)默认情况下是隐藏的。它们不会显示在 gui 文件管理器中,并且命令ls不会看到它们(没有帮助)。要查看您的主目录中的内容,请打开 shell(默认情况下,您将在新 shell 中的主目录中),然后键入ls -A。 这-A国旗告诉ls命令显示隐藏文件。您应该看到.profile.bash_profile,然后可以对其进行编辑。添加冒号和所需目录的完整路径(完整路径应以 开头,以/指示其从驱动器根目录的位置)。您不希望在最后一个值后面出现冒号。因此,如果您有正常的 PATH,您可以/sbin这样添加:

PATH=$PATH:/sbin

然而,尽管如此,你仍然无法直接达到/sbin/shutdown这个目的:

telemachus ~ $ /sbin/shutdown -h now
shutdown: you must be root to do that!

通过提供命令的完整路径,我“找到”了该命令,但仍然无法运行它。某些命令(例如shutdown)需要特殊权限。要获得从 shell 发出的权限shutdown,您需要使用su或,sudo具体取决于您使用的系统类型。我已经写了一本小说,所以这是另一天的故事。

答案2

它们之所以“不存在”,是因为它们的位置不在我们的 PATH 环境变量中。您可以通过键入以下内容查看 PATH 中的目录:

echo $PATH

您可以通过输入以下内容来检查命令的位置

whereis shutdown

通常,你会发现你正在寻找的命令的目录不在你的 PATH 中。你可以在登录脚本 (~/.bash_profile) 中添加以下几行,将目录添加到你的路径中。

PATH=$PATH:/my/new/directory
export PATH

答案3

它们存储在/usr/sbin/sbin不包含在用户PATH变量中的目录中(默认情况下)。

答案4

把 Linux 想象成一个多用户系统,这是有道理的。你不希望你正在工作的机器被另一台关闭用户。如果 root 做得好,也许他有充分的理由关闭它。

作为用户你应该能够执行仅影响您空间的操作。如果您将 Linux 作为桌面运行(并且您说您是新手),那么您可能正在运行类似 Ubuntu 或类似的东西。在这些发行版中,您可以使用 GUI 来使用几乎所有东西,并且系统会在需要时询问您密码。

在控制台上,您可以使用su命令获取 root 访问权限(如果您知道 root 的密码)或者sudo su您的发行版使用 sudo。之后,您将拥有破解系统所需的所有权力和特权 :P

相关内容