无法执行 /usr/local/bin/fish:没有此文件或目录

无法执行 /usr/local/bin/fish:没有此文件或目录

首先,我对这一切都很陌生,并且仍在学习,所以在术语和定位方面,请耐心听我说。

设置: Proxmox 虚拟环境 7.2-3 + 容器 + ubuntu-22.04-standard_22.04-1_amd64.tar.zst

问题: 对于我的 Ubuntu 服务器的终端/控制台,我昨天安装了 fisher 和 fish shell,只是为了改变外观。当我尝试重新启动容器时,我收到一个登录问题,这似乎与我放置在目录中的 fish 的位置有关。虽然我并不完全确定。

我不知道如何重新登录容器,我不想从头开始重新设置一切。如能得到任何帮助,我将不胜感激。

更多背景信息和图片:

答案1

首先,好消息是——几乎肯定有办法恢复。坏消息是,我不知道在这种情况下该怎么做。下面我会就我认为可行的方法提出一些建议,但我没有运行 Proxmox,所以我无法直接测试。

但首先我要提出一个建议:

  • 安装软件时,使用官方文档首先,而不是像您上面提到的“技术”网站。

您上面链接的文章是完全错误,并且会导致系统崩溃正确的流程由 Fish 团队记录在以下文件中:

抱歉,我有点想吐槽——您链接的这些网站都是“付费内容网站”。他们付费购买“自由撰稿人”(尽管是“经过审查的”)的文章。不幸的是,这些内容的质量参差不齐。举个我见过的最糟糕的例子,去年一位新访客来到了我经常访问的一个技术主题的 Subreddit。此人写道(转述,但准确):

我对 [topic] 一无所知,也从未使用过它,但有人要求我写一篇关于如何使用 [topic] 做 [xyz] 的文章。有人能给我一些指导吗?

请注意,我不知道哪个他们所写作的网站。

当然,并不是每个付费内容网站上的每篇文章都是这样的,但你上面提到的文章不好。任何绝对、毫无疑问会破坏你的系统的文档都是坏的。主要问题在于:

该文档中的步骤 4(“将 fish shell 设为默认 shell”)内容如下:

sudo chsh -s /usr/local/bin/fish

这只不过是多个错误合二为一而已!

  • 首先,也是最糟糕的——这是 Ubuntu 下 Fish 的错误路径。我相信,在 macOS 下 Fish 的安装路径是这样的。在 Ubuntu 下,它(通常)是/usr/bin/fish,但正如 Fish 文档指出的那样,你应该始终在你的系统。

  • 通过使用sudo chsh不带用户名的命令,它会改变 root 用户的 shell。这很糟糕,并且会使恢复变得更加困难。

    如果你想使用 更改当前用户的 shell sudo,语法如下:

    sudo chsh -s <path/to/shell> $USER
    
  • 但即使这样,这也是一个坏主意,因为chshroot 用户(又名sudo chsh)会允许您设置“坏 shell”路径。它会警告您,但它仍然会更改/etc/passwd为使用您告诉它的坏 shell 路径。

    sudo chsh -s /this/is/bad $USER
    grep $USER /etc/passwd
    

    您将会看到设置了错误的路径。

    附注:我能够在我的系统上尝试这些东西而不用担心损坏,因为我使用的是 Windows Subsystem for Linux,这是一个虚拟环境,我知道我可以轻松恢复任何这些错误。Proxmox 容器实际上应该与 WSL 在“幕后”使用的技术非常相似,所以我假设那里有同样简单的恢复机制。

正确的在 Ubuntu 下将 shell 更改为 Fish 的命令很简单:

chsh -s /usr/bin/fish

只要你不使用sudo,它就会改变你的用户的 shell,它将证实外壳很好。


恢复计划

您提到您正在使用 Ubuntu 作为 Proxmox 中的容器。我认为这很好。如果您使用的是 VM,则需要使用有效的 shell 在 Proxmox 下启动 Ubuntu。这仍然是可能的。

再次,坏消息是,我不太清楚如何做到这一点,而且由于 Proxmox 无法运行在下面Ubuntu,您可能需要其他网站(例如 Proxmox 论坛)来回答这个问题。一般来说,您需要:

  • 访问 Proxmox 命令行。

  • 我从 Proxmox 文档中假设你需要使用pct管理容器的工具。

  • 使用有效的 shell 访问 Ubuntu 容器。你可以尝试pct exec <vmid> /usr/bin/bash

  • 您需要进入rootUbuntu 容器,我相信这将是默认的pct

一旦您以 root 身份在有效的 shell 中访问 Ubuntu 容器:

  • chsh -s /usr/bin/bash

    由于当前用户的 shell 无效,因此此方法可能无法奏效。不过,我相信 root 仍可以重置 shell(普通用户肯定无法重置)。不过,如果您遇到问题,另一种选择是:

    vipw
    

    这将允许您直接编辑您的/etc/passwd,并将其更改/usr/local/bin/fish/usr/bin/bash

    这会将您的 root 用户的 shell 重置为一个好的 shell。对于 root,我建议将 shell 保留为 Bash。按照 Fish 文档中的说明,将普通非 root 用户的 shell 更改为 Fish。

相关内容