0

我为 nagios 自定义插件和配置制作了一个 bash 脚本,为了简单起见,我使用 equivs

这是我的控制文件。

在 Files: section 中,我告诉文件将自己复制到正确的路径。

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 变为空后退出。

任何帮助,将不胜感激。我对这个 bash 事情很陌生。

4

1 回答 1

3

如果您想确保 bash 命令始终成功,即使最后一个程序给出非空返回值,只需添加一个“最后一个”命令即可成功。

就像是

INET=$(/sbin/ifconfig eth0 | grep -o -e "inet addr:[^ ]*" | grep -o -e "[^:]*$" || true)

在这里我们调用true(一个总是成功的小程序),每当grep失败时(||意味着OR并且是一种根据前一个退出状态链接程序的方法)

但是,您的脚本有许多缺陷:

  • 您的 grep 表达式“inet addr:”只会在英语语言环境中给出正确的结果;例如,在德语环境中运行时 ( LANG=de),您可能会得到类似inet Adresse: 192.168.7.10(原文如此!)
  • 您正在无条件地移动文件;如果这些文件不存在会怎样?
  • 您正在无条件地将文件移动到/etc. /etc是系统管理员根据需要调整系统的地方;您不得删除或恢复系统管理员的配置。您应该记录如何正确配置系统(以便系统管理员可以自己完成);如果你坚持通过自动配置系统来“帮助”,你应该使用像debconf这样的东西
  • 您假设安装了很多软件,并且该软件在您的路径中。您可能应该使用您正在使用的二进制文件的完全限定路径,例如,/sbin/ifconfig而不仅仅是ifconfig
于 2013-02-05T16:43:34.450 回答