我有一个 ZyXEL NAS326 网络驱动器,它运行 BusyBox v1.19.4 以及一个附加的 OpenWrt 存储库。每次重新启动后,系统看不到 OpenWrt 二进制文件的路径,也不会记住命令历史记录。即使我运行命令. /opt/etc/profile
,然后重新启动后也没有命令历史记录,也没有 OpenWrt 二进制文件的路径。此 NAS 上的默认控制台是 ash。如何配置系统,使系统始终在控制台中有活动的命令历史记录,并可以访问路径中的 OpenWrt bianrium?
答案1
所以,首先,busybox/ash 是否保存历史记录是一个编译时选项;换句话说,如果.ash_history
在运行至少一个命令后主目录中没有文件,那么您无能为力 – 您需要使用另一个实际上具有该功能的 shell。我想说,无论如何,这在您的用例中可能是明智的,因为:“我想要命令历史记录”只是说“我多次使用此 shell 来修复某些问题”,这意味着这ash
实际上不是最佳的交互式 shell。它的目的是要轻薄,而不是完全替代您的桌面外壳!
然后:
我使用命令创建了 /home/test.txt 文件
touch /home/test.txt
,并在其中输入了内容 12345。重启后文件消失
看到你的主目录不是持久的,没有地方可以实际存储 shell 历史记录! (它通常存储在 中~/.ash_history
,但正如您所注意到的,它不会被写入永久存储,但可能保留在 RAM 覆盖层中,无法在重新启动后保存。)
幸运的是,在大多数 shell 中,您可以使用HISTFILE
环境来设置不同的位置。 Busybox 没有记录这一点,但至少在其当前的代码版本中,它确实尊重该变量。但您的 NAS 上运行的是哪个版本以及哪些选项 – 没有人知道! (另一个迹象表明,在这样的系统上,您可能希望运行一个不太精简的 shell,例如 zsh)。
如何配置系统,使系统始终在控制台中有活动的命令历史记录,并可以访问路径中的 OpenWrt bianrium?
你甚至不能持久地写入/etc,所以我会同意:你不能,直到你弄清楚如何做到这一点,这可能不是你能做的事情。 (如果您始终知道根文件系统在重新启动后处于相同的出厂状态,则它可以使消费类设备变得不那么不可靠,并且在暴露安全漏洞后持续获得未经授权的访问变得更加困难。显然,NAS 不是应该成为终端服务器!)
我不知道这个 openwrt 存储库是如何工作的,但我敢打赌它有自己的文档 - 并且很可能以这种方式安装的软件将查看 /opt/etc 而不是 /etc,所以如果你可以更改用户的 shell (使用chsh
)通过 openwrt 安装在 /opt/bin 中的东西,也许你至少可以配置它。
除此之外,您所能做的就是希望 SSH 服务器(或您用来登录的任何内容)允许您指定两个环境变量(例如HISTFILE
,您指向用户可以访问的位置,并且在重新启动后保持不变)和你想要运行的命令 - 那么你可以做类似的事情
env 'HISTFILE=/path/to/persistent/storage/on/NAS/.zsh_history' \
ssh \
-o SendEnv=HISTFILE \
-t \
youruser@NAS_hostname_or_IP_address \
/path/to/openwrt-installed/zsh/on/NAS/zsh
在你的机器上确保 1.zsh
使用了 openwrt 安装的“正确”shell,这肯定会保存历史记录,2. 它使用持久路径来存储其历史记录。
问题是:/etc/profile文件模板从哪里来?最初,PATH 部分中有一个条目
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:${BASE_PATH}/sbin:/usr/local/zy-pkgs/bin:${BASE_PATH}/htp
,修改后如下所示:PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:${BASE_PATH}/sbin:/usr/local/zy-pkgs/bin:${BASE_PATH}/htp:/opt/bin
重新启动后,一切都恢复到原来的状态
您需要检查 Zyxel 如何构建其操作系统映像。有机会的是你可以做同样的事情,并进行所需的修改!
这Marvell 演示(Marvell 是一家构建 SoC(中央处理器,您的 NAS 所基于的)的公司,表示他们提供了完整的 OpenEmbedded/Yocto 树,允许集成商(例如 Zyxel)构建适合其确切用例的 Linux 发行版。这不是合勤科技不太可能使用它,修改必要的层,添加自己的软件并使用它来构建图像。现在,合勤科技是大众市场网络设备的大型供应商,对于他们来说,安全事件的成本非常高,很可能(并且对于上述情况)。非常好的理由)已经锁定了他们的 SecureBoot,只允许启动签名的固件,这可能根本不是你可以解决的问题——有适当的加密技术可以让硬件区分修改过的系统映像和未修改过的系统映像。
因此,当您构建这样一个包含修改后的 /etc 的映像时,您很可能无法启动它,因为您无法对其进行签名。这一切都归结为合勤科技对其系统的锁定程度。
坦白说,嗯,我是不是确定小型 NAS 设备上的根系统是我想要的 shell 历史记录吗?听起来您想弄清楚供应商的应用程序商店是否以及如何允许您安装容器或类似的隔离环境,以便您可以像在成熟的桌面上一样运行交互式 shell。但。坦率地说。它是一个 1.3 GHz 单核 ARMv7,只有 512 MB RAM(这对于存储设备来说非常小)。我确实希望 Zyxel 投入大量工作来优化通过 DMA 网络进行的存储访问,因为否则它就已经承担了在访问文件时兼顾良性网络速度的繁重任务,而且我不相信这是一个您会选择的平台。想跑任何事物其他的。
1 对于未来的嵌入式开发读者来说,编译自己的 busybox:编译时选项是ENABLE_FEATURE_EDITING_SAVEHISTORY
.