为 debian 转换 RPM 包失败“由于 shell 元字符”

为 debian 转换 RPM 包失败“由于 shell 元字符”

我正在尝试将“MegaRAID Storage Manager”RPM 包转换为 debian dep 包。为此,我使用了 alien 包,如下所述:

https://hosting-tutorials.co.uk/tutorials/linux/installing-megaraid-storage-manager-on-debian

这是我尝试转换的包: https://docs.broadcom.com/docs-and-downloads/17.05.06.00_MSM_Linux-x64.zip

软件包“lib-utils2_1.00-12_all”可以顺利转换为.deb,但“MegaRAID_Storage_Manager-17.05.06-00.noarch.rpm”却不行:

# alien --scripts *.rpm
lib-utils2_1.00-12_all.deb generated

Package build failed. Here's the log:
dh binary
   dh_update_autotools_config
   dh_autoreconf
   create-stamp debian/debhelper-build-stamp
   dh_testroot
   dh_prep
   debian/rules override_dh_auto_install
make[1]: Entering directory '/root/MSM/disk/MegaRAID_Storage_Manager-17.05.06'
mkdir -p debian/megaraid-storage-manager
# Copy the packages's files.
find . -maxdepth 1 -mindepth 1 -not -name debian -print0 | \
        sed -e s#'./'##g | \
        xargs -0 -r -i cp -a ./{} debian/megaraid-storage-manager/{}
make[1]: Leaving directory '/root/MSM/disk/MegaRAID_Storage_Manager-17.05.06'
   dh_installdocs
   dh_installchangelogs
   dh_perl
   dh_usrlocal
dh_usrlocal: error: Cannot generate a correct shell script for /usr/local/MegaRAID Storage Manager due to shell metacharacters
make: *** [debian/rules:7: binary] Error 25

我不知道如何修复错误“由于 shell 元字符,无法为 /usr/local/MegaRAID Storage Manager 生成正确的 shell 脚本”并将非常感谢您的帮助。

我尝试的主机是 Debian 10 和 Debian 11,都是 amd64 架构,运行“bash”shell。我还尝试了“sh”shell。

答案1

总结: 中的目录不支持空格和其他元字符/usr/local

/usr/local/MegaRAID Storage Manager包含空格。显然,这个包没有遵循 *nix 世界中的良好实践(责怪 LSI/Broadcom)。

您可以改为直接使用 alien-convert 转换为 tar 或提取rpm2cpio,弄清楚安装脚本的使用方式并了解如何重用它们,还可以选择查看是否可以使用空格重命名目录(如果对它的任何引用也可以轻松替换),并直接使用它构建二进制包dpkg-deb -b不会受到此类问题的影响,但会创建一个不符合 Debian 政策的包。

下面的解释...


Debian 政策/usr/local规定除了通过间接方法安装某些目录外,包中不应安装任何内容:

9.1.2. 针对特定地点的计划

根据 FHS 的规定,软件包不得将任何文件放置在 /usr/local,要么将它们放入文件系统档案中以便解压,dpkg要么通过在其维护脚本中对它们进行操作。

然而,该软件包可能会在下面创建空目录/usr/local这样系统管理员就知道将站点特定文件放在哪里。这些不是 中的目录/usr/local,而是 中的目录的子目录/usr/local。如果这些目录 ( /usr/local/*/dir/) 为空,则应在删除软件包时将其删除。

请注意,这仅适用于目录以下 /usr/local, 不是 /usr/local

[...]

因此,这个包无论如何都不能兼容,例如文件/usr/local/MegaRAID Storage Manager/startmonitorhelp.sh不兼容:它是一个文件打包在某处/usr/local

alien使用dh_usrlocal构建助手来自动转换(仍然兼容)目录,以便在维护者脚本中添加(例如在 Debian等中preinstpostinst这些脚本在 .deb 中单独存档应收账存档并将存储在/var/lib/dpkg/info/稍后),然后mkdir在安装时执行一些命令:

dh_usrlocal是一个 debhelper 程序,可用于构建软件包,它将在/usr/本地安装时。

它找到以下子目录usr/本地在软件包构建目录中,并删除它们,用维护者脚本片段替换它们(除非-n使用)以在安装时创建目录,并在软件包被删除时删除它们,以符合 Debian 政策的方式。这些片段由插入到维护者脚本中dh_installdeb

perl脚本的内容/usr/bin/dh_usrlocal包括:

          # Detect some obvious cases of "this will not end
          # well".  We rely on what "while read dir ... ; do"
          # can handle for correctness.
          if ($fn =~ m{[\s!'"\$()*#;<>?@\[\]\\`|]}) {
                  error("Cannot generate a correct shell script for $fn due to shell metacharacters");
          }

\s这意味着 PCRE 中的任何空格都属于禁用元字符的一部分,并会在解析时触发错误/usr/local/MegaRAID Storage Manager

答案2

您找到解决方案或解决方法了吗?我已经与 MSM 斗争了好几天,却没有机会在 Debian11 中启用远程配置。

答案3

在花了太多时间尝试解决上述问题之后,意识到有一个

rpm可以安装的包

然后就跑了:
rpm -i MegaRAID_Storage_Manager-17.05.06-00.noarch.rpm --nodeps
/etc/init.d/vivaldiframeworkd start

它似乎正在起作用,我在系统日志中至少收到了两条消息:

Jan 10 21:03:21 Xba MR_MONITOR[214454]: <MRMON044> Controller ID:  0   Time established since power on:   Time   2023-01-08, 05:11:32      33  Seconds
Jan 10 21:03:51 Xba MR_MONITOR[214454]: <MRMON044> Controller ID:  0   Time established since power on:   Time   2023-01-10, 21:03:51      255169  Seconds

现在需要安装 xterm 和 xpra 以便我可以尝试运行su -c /usr/local/MegaRAID Storage Manager/startupui.sh...你们也都是这样做的吗?

好吧,我无法使用安装的最新 Java 17 来启动它,因此我安装了 Java 11 并取得了一些成功......您需要将以下内容添加到/etc/init.d/msm_profile

JRE_HOME="/usr/lib/jvm/java-11-openjdk-amd64"
export JRE_HOME

MSM 窗口会打开,但当我登录后,X 会话会立即终止……这可能是我的 GTK 库或其他方面的问题。我会尝试稍后获取更多日志。我也尝试给它提供来自 Adoptium 的旧版 Java 8。在这种情况下,我使用了:

JRE_HOME="/usr/lib/jvm/jdk8u352-b08-jre"
export JRE_HOME

但这没用。现在运行时startupui.sh我只看到一个黑色窗口,也尝试过重新启动 vivaldi 框架(实际上每次更改 java 版本时都需要重新启动,因为它用于/etc/init.d/msm_profile启动)。

希望你比我幸运,让我们知道进展如何!

相关内容