尝试通过远程shell脚本在变量中存储awk语句

时间:2017-02-08 16:27:12

标签: shell awk nagios

因此,如果您在我尝试监控的框中本地运行此命令:

df -Ph | awk '0+$5 >= 70 {print}'

它返回超过70%阈值的所有文件系统。

在我的shell脚本中,我正在尝试:

set -x

SPACE70=$(df -Ph | awk '0+$5 >= 70 {print}')

if [ "$SPACE70" != "" ]; then

    msg_text="WARNING $HOST has a File system above threshold $SPACE70 "
    result=$STATE_WARNING

fi

即使文件系统超过70,Space70也没有存储任何东西......在本地但不是远程工作。对于上下文,我计划在Nagios上运行它并通过SSH远程登录到盒子。

有什么想法?我尝试了另一个编辑,但它没有帮助:

COMMAND="df -Ph "
SPACE_REPORT=`/usr/local/nagios/sshpass-1.05/sshpass  -p$PASS ssh -q -o StrictHostKeyChecking=no -o ConnectTimeout=310 $USER@$HOST "$COMMAND"`
# Set default to OK
result=$STATE_OK
SPACE85=0
SPACE95=0
#
set -x
#AWK FOR WARNING:
SPACE85=$($SPACE_REPORT | awk '0+$5 >= 70 {print}')
if [ "$SPACE85" != "" ]; then
msg_text="WARNING $HOST has a File System above threshold $SPACE85 "
result=$STATE_WARNING
fi

3 个答案:

答案 0 :(得分:1)

您只是在代码的第10行中丢失了一个echo和引号,即调用awk的那个:

#AWK FOR WARNING:
SPACE85=$($SPACE_REPORT | awk '0+$5 >= 70 {print}')

应该是:

#AWK FOR WARNING:
SPACE85=$(echo "$SPACE_REPORT" | awk '0+$5 >= 70 {print}')

我测试了它并且远程工作。

希望有所帮助!

答案 1 :(得分:0)

如果我建议,

SPACE70=$(df -Ph | awk '0+$5 >= 70 {N++} END {print 0 + N}')

if [ $SPACE70 -gt  0 ]

我没有看到你的第一个版本有什么特别的错误,除了它做了比必要更多的工作。

远程执行时,我会怀疑PATH问题。因为没有调用交互式shell,所以很容易假设实际上没有发生的初始化。另外,我对sshpass一无所知,但您确定您在标准错误上看到了消息吗?如果没有,那可能解释了这个谜。

答案 2 :(得分:0)

我看到了你的命令并理解了这个问题。现在我发布我的解决方案版本。

据我所知,您要检查远程主机或多个主机上的磁盘空间,如果磁盘空间超过70%,则生成警报。如果我的理解不正确,请纠正我。

在我们看到脚本之前,让我们看一下输出:

%_Host@User:/home/Gaurava/study> ./fscheck.sh

==========[192.168.246.132 STARTS]==========
[ **ALERT** (192.168.246.132) has FS above THRESHOLD ---vmhgfs-fuse              224G  182G   42G  82% /mnt/hgfs--- ]
[ **ALERT** (192.168.246.132) has FS above THRESHOLD ---/dev/sda1                497M  376M  122M  76% /boot--- ]
==========[192.168.246.132 ENDS]==========

==========[192.168.246.137 STARTS]==========
[ **ALERT** (192.168.246.137) has FS above THRESHOLD ---.host:/         224G  182G   42G  82% /mnt/hgfs--- ]
==========[192.168.246.137 ENDS]==========

%_Host@User:/home/Gaurava/study>

在上面的输出中,脚本逐个登录到2个远程主机,然后执行命令检查磁盘空间,发现3个文件系统超过了指定的限制。所以它生成ALERT。

脚本:

#!/bin/bash

# Define your command, host/s and user/s.
command='df -Ph'
host1=192.168.246.132
host2=192.168.246.137
user=gaurav

# Main loop STARTS
for h in $host1 $host2
do

        # This line can be removed.
        echo "==========[$h STARTS]=========="

        # Here you can replace this with your sshpass command.
        # I am feeding the command output to a while loop to read
        # the output line by line, for each of the host/s.

        ssh $user@$h "$command" | while read line

        do
                # Now we check, if the disk space output contains anything
                # which matches value greater than 70%, thats it! and
                # generate alert.

                if [[ $line =~ .*7[1-9]%.* || $line =~ .*[89][0-9]%.* ]]
                then
                        # If above 'if' statement is TRUE, It generates ALERT
                        # in the below format. '$line' is the variable holding
                        # info about the file system breaching the threshold.

                        echo "[ **ALERT** ($h) has FS above THRESHOLD ---$line--- ]"

                elif [[ $line =~ .*100% ]]
                then
                        echo "[ **ALERT** ($h) FS reached 100% ---$line--- ]"
                fi

        done
        # This line can be removed.
        echo "==========[$h ENDS]==========" ; echo
done
# Main loop ENDS.

我的脚本没有使用您尝试使用的完全相同的逻辑,但它可以使用类似的逻辑,并使用几个循环,这可以简化我们的问题并提供更好的控制

我希望这有助于解决您的问题。如果有任何好处,请告诉我!

编辑:在if循环中添加了else部分。虽然当我检查时,它忽略了任何FS,如果它已经达到100%,但是,添加警告/通知没有任何害处。这确实是一个好主意。

Edit2:更新了if循环,增加了一个条件并添加了100%的echo。后来我意识到早期的循环不匹配数字71,81,91。