执行postinst bash脚本时deb包失败
我正在为nagios定制插件和配置制作bash脚本 我使用equips是为了简单 这是我的控制文件 在文件:部分中,我告诉文件将自己复制到正确的路径执行postinst bash脚本时deb包失败,bash,debian,dpkg,Bash,Debian,Dpkg,我正在为nagios定制插件和配置制作bash脚本 我使用equips是为了简单 这是我的控制文件 在文件:部分中,我告诉文件将自己复制到正确的路径 Files: check_cpu_loadx /usr/lib/nagios/plugins check_ipmi_sensors /usr/lib/nagios/plugins check_libreoffice_count /usr/lib/nagios/plugins check_ram_per_user /usr/lib/nagios
Files: check_cpu_loadx /usr/lib/nagios/plugins
check_ipmi_sensors /usr/lib/nagios/plugins
check_libreoffice_count /usr/lib/nagios/plugins
check_ram_per_user /usr/lib/nagios/plugins
check_ram_usage2 /usr/lib/nagios/plugins
check_ram_usage_percentage /usr/lib/nagios/plugins
check_tcptraffic /usr/lib/nagios/plugins
nrpe_custom.cfg /etc/nagios
在postinst部分中,它是一个用于后期安装的bash脚本
File: postinst
#!/bin/bash -e
set -x
echo 'configuring nrpe.conf file.'
mv /etc/nagios/nrpe.cfg /etc/nagios/nrpe.original.backup
mv /etc/nagios/nrpe_custom.cfg /etc/nagios/nrpe.cfg
chmod -R +x /usr/lib/nagios/plugins
echo 'Installing tcp-ip addon..'
FLAG=0
Interfaces=`ifconfig -a | grep -o -e "[a-z][a-z]*[0-9]*[ ]*Link" | perl -pe "s|^([a-z]*[0-9]*)[ ]*Link|\1|"`
for Interface in $Interfaces; do
INET=`ifconfig $Interface | grep -o -e "inet addr:[^ ]*" | grep -o -e "[^:]*$"`
MASK=`ifconfig $Interface | grep -o -e "Mask:[^ ]*" | grep -o -e "[^:]*$"`
STATUS="up"
#loopback
if [ "$Interface" == "lo" ]; then
continue
fi
#if eth is down
if [ -z "$INET" ]; then
continue
fi
#if eth ip not starts with 10. or 192.
if [[ "$INET" == 10.* ]]
then
ActiveEth=$Interface;
break
elif [[ "$INET" == 192.* ]]
then
ActiveEth=$Interface;
break
else
echo "Ethernet Selection Failed!Configure nrpe.cfg manually.Change tcp_traffic plugin paramethers according to your current ethernet.";
FLAG=1
break
fi
done
if [[ "$FLAG" == 0 ]]
then
echo 'Selected Ethernet :'$ActiveEth
sed -i -e "s/eth0/$ActiveEth/g" /etc/nagios/nrpe.cfg
fi
echo 'nrpe.conf changed.'
echo 'Nagios-nrpe-server restarting.'
service nagios-nrpe-server restart
echo 'IPMI modules are loading.'
modprobe ipmi_devintf
modprobe ipmi_msghandler
echo "IPMI modules are added to startup."
#echo "ipmi_si" >> /etc/modules
echo "ipmi_devintf" >> /etc/modules
echo "ipmi_msghandler" >> /etc/modules
这里的问题是,当我将其编译为deb包时,我得到了“安装后安装的子流程脚本返回错误退出状态1”
然后我添加了set-x进行调试。问题是配置tcp ip插件时,有些机器有不止一个以太网卡。因此我需要选择ip以10.*或192开头的那一个*
在第二部分中,有一行
INET=ifconfig$Interface | grep-o-e“INET addr:[^]*“| grep-o-e”[^::*$”
当以太网设备没有ip时,grep返回null,INET变量变为null,这就是进程退出状态为1的原因。
在那一行之后,当我输入“$?”时,它会显示1
所以这里的问题是,当我运行dpkg-i来安装该包时,bash脚本在看到INET变为null后退出
任何帮助都将不胜感激。我对bash还不熟悉。如果要确保bash命令始终成功,即使最后一个程序给出了非null返回值,只需添加一个将成功的“最后一个”命令即可 差不多
INET=$(/sbin/ifconfig eth0 | grep -o -e "inet addr:[^ ]*" | grep -o -e "[^:]*$" || true)
这里我们称之为true
(一个总是成功的小程序),只要grep
失败(|
意味着或,是一种根据前一个程序的退出状态来链接程序的方法)
但是,您的脚本有许多缺陷:
- 您的grep表达式“inet addr:”只能在英语语言环境中给出正确的结果;e、 g.在德国环境中运行(
LANG=de
)时,您可以获得类似于inet-address:192.168.7.10
(原文如此)的字符串
- 您正在无条件地移动文件;如果这些文件不在那里会发生什么
- 您正在无条件地移动
/etc
中的文件/etc
是系统管理员根据需要调整系统的地方;您不得删除或恢复系统管理员的配置。您应该记录如何正确配置系统(以便系统管理员可以自己完成);如果您坚持通过自动配置系统来“帮助”,那么您应该使用
- 您假设安装了很多软件,并且该软件在您的路径中。您可能应该使用指向正在使用的二进制文件的完全限定路径,例如
/sbin/ifconfig
,而不仅仅是ifconfig
如果要确保bash命令始终成功,即使最后一个程序给出了非null返回值,只需添加一个将成功的“最后一个”命令即可
差不多
INET=$(/sbin/ifconfig eth0 | grep -o -e "inet addr:[^ ]*" | grep -o -e "[^:]*$" || true)
这里我们称之为true
(一个总是成功的小程序),只要grep
失败(|
意味着或,是一种根据前一个程序的退出状态来链接程序的方法)
但是,您的脚本有许多缺陷:
- 您的grep表达式“inet addr:”只能在英语语言环境中给出正确的结果;e、 g.在德国环境中运行(
LANG=de
)时,您可以获得类似于inet-address:192.168.7.10
(原文如此)的字符串
- 您正在无条件地移动文件;如果这些文件不在那里会发生什么
- 您正在无条件地移动
/etc
中的文件/etc
是系统管理员根据需要调整系统的地方;您不得删除或恢复系统管理员的配置。您应该记录如何正确配置系统(以便系统管理员可以自己完成);如果您坚持通过自动配置系统来“帮助”,那么您应该使用
- 您假设安装了很多软件,并且该软件在您的路径中。您可能应该使用指向正在使用的二进制文件的完全限定路径,例如
/sbin/ifconfig
,而不仅仅是ifconfig