在运行之前修补 shell 脚本

在运行之前修补 shell 脚本

我有一个 shell 脚本(arch-chroot来自 Arch Linuxarch-install-scripts包),在启动chroot.它chroot在最后一行开始:

SHELL=/bin/sh unshare --fork --pid chroot "$chrootdir" "$@"

对于我的用例,我想使用完全相同的脚本,并在最后一行添加“补丁”

SHELL=/bin/bash chroot "$chrootdir" "$@"

做这个的最好方式是什么?如果重要的话,arch-chroot脚本需要以 root 权限运行。现在我只有脚本的修补副本。如果原始脚本被更新,那么我的修补版本将“过时”。我想我可以根据需要在临时位置进行复制和修补,但我不确定这是否更好。

有没有办法临时修补脚本?

只有当它所属的包更新时,原始脚本才会被更改。我的目标是保持原始脚本不变,但有一种方法可以调用原始脚本最新版本的修补版本。

答案1

一个简单粗暴的解决方法是编写一个小脚本,使用原始文件的修改副本创建一个临时文件arch-chroot,然后运行 ​​tmpfile。例如:

#!/bin/sh
scriptfile=$(mktemp /tmp/tempscript.XXXXX)
sed 's#SHELL=.*#SHELL=/bin/bash chroot "$chrootdir" "$@"#' /usr/bin/arch-chroot > $scriptfile

$scriptfile "$@"

请注意,这假设只有一行与字符串匹配,SHELL=如果/usr/bin/arch-chroot有更多行或没有行,则会默默失败。

答案2

如果您使用的脚本是在操作系统发行版中提供的,那么它被更新的机会非常高。我建议您围绕这个原始脚本编写一个包装脚本,它将删除原始脚本的最后一行并将您的自定义行附加到末尾。然后调用新创建的副本。我认为这是最简单的方法。

mv original_script original_script.orig  # make a backup copy of original
sed -i '$ d' original_script.orig > original_script  # remove last line
echo 'SHELL=/bin/bash chroot "$chrootdir" "$@"' >> original_script # add your line to the end
original_script # run the script
mv original_script.orig original_script  #restore the original in place

答案3

为此创建您自己的修改包。请注意使其保持最新状态,也许可以使用一些特定于发行版的技巧来避免自动更新。

我不明白你提出的改变的原因(没有任何 Arch 知识),但乍一看它是你应该做的事情不是出于安全原因,或者您的用例可能足够相关,足以保证上游补丁以某种方式启用此功能。无论哪种情况,我建议您通过您的发行版的错误报告/增强请求系统与知识渊博的人讨论。

或者在这里讨论您想要实现的目标(而不是像这个问题那样,您如何尝试实现目标)。

相关内容