2014-10-19 4 views
1

Я написал сценарий, который автоматически загружает и устанавливает Nagios NRPE на станциях CentOS. Соответствующая часть сценария:Bash: оператор IF возвращает неожиданное значение, вы можете найти причину?

read -r -p "How would you like to configure the NRPE daemon? [X]inetd/Standalone [D]aemon " DMN 
     if [ "DMN" = "x" -o "DMN" = "X" ]; 
       then 
      DMNMODE="xinetd" 
         cat <<EOF> $XINETDFILE 
service nrpe 
{ 
     flags   = REUSE 
     type   = UNLISTED 
     port   = $NRPEPORT 
     socket_type  = stream 
     wait   = no 
     user   = $NGUSER 
     group   = $NGGROUP 
     server   = /usr/sbin/nrpe 
     server_args  = -c $NRPECFG --inetd 
     log_on_failure += USERID 
     disable   = no 
     only_from  = 127.0.0.1 $NAGIOSSRV 
} 
EOF 
      /etc/init.d/xinetd restart 
     elif [ "DMN" = "d" -o "DMN" = "D" ]; 
        then 
       chkconfig nrpe on ; $NRPESVC start 
       DMNMODE="daemon" 

    fi 
function CheckInstMode { 
           if [ "DMNMODE" = "daemon" ]; 
             then 
         $NRPESVC restart 
        else 
         $XINETDSVC restart 
           fi 
} 
read -r -p "Would you like to pull NRPE plugins from Nagios server? [y/n]" ANS1 
     if [ $ANS1 = "y" ]; 
       then 
         if [ $ARCH = "64" -a $NGSARCH = "64" ] ; 
         then scp [email protected]$NAGIOSSRV:$NGPLUGINS64/* $NGPLUGINS64/ 
         chown -R $NGUSER.$NGGROUP $NGPLUGINS64 
      CheckInstMode 
         elif [ "$ARCH" = "64" -a "$NGSARCH" = "32" ] ; 
         then scp [email protected]$NAGIOSSRV:$NGPLUGINS32/* $NGPLUGINS64/ 
         chown -R $NGUSER.$NGGROUP $NGPLUGINS64 
      CheckInstMode 
         elif [ "$ARCH" = "32" -a "$NGSARCH" = "32" ] ; 
         then scp [email protected]$NAGIOSSRV:$NGPLUGINS32/* $NGPLUGINS32/ 
         chown -R $NGUSER.$NGGROUP $NGPLUGINS32 
      CheckInstMode 
         elif [ "$ARCH" = "32" -a "$NGSARCH" = "64" ] ; 
         then scp [email protected]$NAGIOSSRV:$NGPLUGINS64/* $NGPLUGINS32/ 
         chown -R $NGUSER.$NGGROUP $NGPLUGINS32 
      CheckInstMode 
         fi 
     fi 

Идея функции, чтобы проверить, какой режим установки был выбран и перезапустить /etc/init.d/xinetd если Xinetd был выбран или перезапустить /etc/init.d/nrpe, если был выбран NRPE. Я запускал скрипт в режиме отладки (sh -x script), и это выход:

+ case $ARCH in 
+ echo 'Configuring /etc/nagios/nrpe.cfg' 
Configuring /etc/nagios/nrpe.cfg 
+ cat 
+ echo 'Adding nagios user to /etc/sudoers' 
Adding nagios user to /etc/sudoers 
+ echo 'Defaults:nagios !requiretty' 
+ echo 'nagios ALL = NOPASSWD:/usr/lib64/nagios/plugins/*' 
+ echo 'Setting ownership of nagios and nagios plugins folders to nagios user' 
Setting ownership of nagios and nagios plugins folders to nagios user 
+ chown -R nagios.nagios /etc/nagios 
+ chown -R nagios.nagios /usr/lib64/nagios/plugins 
+ read -r -p 'How would you like to configure the NRPE daemon? [X]inetd/Standalone [D]aemon ' DMN 
How would you like to configure the NRPE daemon? [X]inetd/Standalone [D]aemon x 
+ '[' DMN = x -o DMN = X ']' 
+ '[' DMN = d -o DMN = D ']' 
+ read -r -p 'Would you like to pull NRPE plugins from Nagios server? [y/n]' ANS1 
Would you like to pull NRPE plugins from Nagios server? [y/n]y 
+ '[' y = y ']' 
+ '[' 64 = 64 -a 64 = 64 ']' 
+ scp '[email protected]:/usr/lib64/nagios/plugins/*' /usr/lib64/nagios/plugins/ 
1            100% 71  0.1KB/s 00:00  
Back-check_services.pl      100% 2485  2.4KB/s 00:00  
cacticpu.sh         100% 189  0.2KB/s 00:00  
check_apt          100% 99KB 99.4KB/s 00:00  
check_breeze         100% 2253  2.2KB/s 00:00  
check_by_ssh         100% 41KB 40.6KB/s 00:00  
check_clamd         100% 46KB 46.5KB/s 00:00  
+ chown -R nagios.nagios /usr/lib64/nagios/plugins 
+ CheckInstMode 
+ '[' DMNMODE = daemon ']' 
+ /etc/init.d/nrpe restart 
Shutting down nrpe:          [ OK ] 
Starting nrpe:            [ OK ] 
+ stat --format=%Y /etc/passwd 
+ chmod +x /usr/local/share/applications/file 
+ read -r -p 'Would you like to test NRPE? [y/n]' ANS2 
Would you like to test NRPE? [y/n] 

Как вы можете видеть DMNMODE переменную, которая, как ожидается, будет xinetd является daemon вместо этого, даже если мой вход на вопрос xinetd или daemon был «x». Это заставляет сценарий перезапускать nrpe, даже если выбрано xinetd, можете ли вы рассказать мне, что я делаю неправильно?

Edit # 1: я все еще получаю неожиданный результат с переменной $DMNMODE, Вот отладить запуск:

How would you like to configure the NRPE daemon? [X]inetd/Standalone [D]aemon x 
+ [[ x = [Xx] ]] 
+ DMNMODE=xinetd 
+ cat 
+ /etc/init.d/xinetd restart 
Stopping xinetd:           [ OK ] 
Starting xinetd:           [ OK ] 
+ read -r -p 'Would you like to pull NRPE plugins from Nagios server? [y/n]' ANS1 
Would you like to pull NRPE plugins from Nagios server? [y/n]y 
+ '[' y = y ']' 
+ '[' 64 = 64 -a 64 = 64 ']' 
+ scp '[email protected]:/usr/lib64/nagios/plugins/*' /usr/lib64/nagios/plugins/ 
1            100% 71  0.1KB/s 00:00  
Back-check_services.pl      100% 2485  2.4KB/s 00:00  
cacticpu.sh         100% 189  0.2KB/s 00:00  
check_apt          100% 99KB 99.4KB/s 00:00  
negate          100% 30KB 29.7KB/s 00:00  
plugins.pm         100% 1939  1.9KB/s 00:00  
+ chown -R nagios.nagios /usr/lib64/nagios/plugins 
+ CheckInstMode 
+ '[' xinetd = daemon ']' 
+ /etc/init.d/nrpe restart 
Shutting down nrpe:          [ OK ] 
Starting nrpe:            [ OK ] 
+ stat --format=%Y /etc/passwd 
+ chmod +x /usr/local/share/applications/file 
+ read -r -p 'Would you like to test NRPE? [y/n]' ANS2 

Мой вопрос ... Почему функция возвращает неверное значение? если вы прокрутите вверх, вы увидите, что я набрал X в вопросе, что означает, что переменная DMNMODE установлена ​​на xinetd, а не nrpe ... можете ли вы попытаться найти проблему, пожалуйста?

Ваша помощь очень ценится! Itai

+0

Взгляните на http://www.shellcheck.net/ – Cyrus

ответ

2

$DMN ссылки отсутствуют ссылки $.

if [ "$DMN" = "x" -o "$DMN" = "X" ]; 
+0

Как я мог не видеть это? Спасибо чувак! –

+0

В 'if [" DMNMODE "=" daemon "];' '' 'также отсутствует. –

+1

Поскольку вы используете другие функции 'bash' (' read -p'), вы можете просто использовать 'if [[$ DMN = [Xx]] ;; вместо. По крайней мере, не используйте устаревшее '-o' primary; используйте '[" $ DMN "=" x "] || ["$ DMN" = "X"] 'вместо этого. – chepner