试图通过远程 shell 脚本将 awk 语句存储在变量中
Attempting to store an awk statement in a variable via remote shell script
因此,如果您 运行 在我试图监控的机器上本地执行此命令:
df -Ph | awk '0+ >= 70 {print}'
它 returns 所有文件系统超过 70% 的阈值。
在我的 shell 脚本中,我正在尝试:
set -x
SPACE70=$(df -Ph | awk '0+ >= 70 {print}')
if [ "$SPACE70" != "" ]; then
msg_text="WARNING $HOST has a File system above threshold $SPACE70 "
result=$STATE_WARNING
fi
并且 Space70
没有存储任何东西,即使文件系统超过 70...在本地工作但不能远程工作。对于上下文,我计划 运行 在 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+ >= 70 {print}')
if [ "$SPACE85" != "" ]; then
msg_text="WARNING $HOST has a File System above threshold $SPACE85 "
result=$STATE_WARNING
fi
您只是在代码的第 10 行(调用 awk 的那一行)中缺少回显和引号:
#AWK FOR WARNING:
SPACE85=$($SPACE_REPORT | awk '0+ >= 70 {print}')
应该是:
#AWK FOR WARNING:
SPACE85=$(echo "$SPACE_REPORT" | awk '0+ >= 70 {print}')
我对其进行了测试,它可以远程运行。
希望对您有所帮助!
如果我可以建议,
SPACE70=$(df -Ph | awk '0+ >= 70 {N++} END {print 0 + N}')
if [ $SPACE70 -gt 0 ]
我看不出您的第一个版本有什么特别的问题,只是它做了不必要的工作。
在远程执行时,我会怀疑 PATH 问题。因为没有调用交互式 shell,所以很容易假设实际上没有发生初始化。另外,我对 sshpass 一无所知,但你确定你看到的是关于标准错误的消息吗?如果不是,那就可以解释这个谜团了。
看到你的命令,明白了问题。现在我发布我的解决方案版本。
据我了解,您想检查远程主机或多台主机上的磁盘 space,如果磁盘 space 超过 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 个远程主机,然后执行命令检查磁盘 space,它发现 3 个文件系统超出了指定的限制。所以它会生成警报。
脚本:
#!/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 部分。虽然我检查的时候,如果它已经达到 100%,它会忽略任何 FS,但是,添加一个 warning/notification 仍然没有什么坏处。确实是个好主意。
Edit2: 用一个条件更新了 if 循环并添加了 100% 的 echo。后来我意识到之前的循环不匹配数字 71,81,91.
因此,如果您 运行 在我试图监控的机器上本地执行此命令:
df -Ph | awk '0+ >= 70 {print}'
它 returns 所有文件系统超过 70% 的阈值。
在我的 shell 脚本中,我正在尝试:
set -x
SPACE70=$(df -Ph | awk '0+ >= 70 {print}')
if [ "$SPACE70" != "" ]; then
msg_text="WARNING $HOST has a File system above threshold $SPACE70 "
result=$STATE_WARNING
fi
并且 Space70
没有存储任何东西,即使文件系统超过 70...在本地工作但不能远程工作。对于上下文,我计划 运行 在 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+ >= 70 {print}')
if [ "$SPACE85" != "" ]; then
msg_text="WARNING $HOST has a File System above threshold $SPACE85 "
result=$STATE_WARNING
fi
您只是在代码的第 10 行(调用 awk 的那一行)中缺少回显和引号:
#AWK FOR WARNING:
SPACE85=$($SPACE_REPORT | awk '0+ >= 70 {print}')
应该是:
#AWK FOR WARNING:
SPACE85=$(echo "$SPACE_REPORT" | awk '0+ >= 70 {print}')
我对其进行了测试,它可以远程运行。
希望对您有所帮助!
如果我可以建议,
SPACE70=$(df -Ph | awk '0+ >= 70 {N++} END {print 0 + N}')
if [ $SPACE70 -gt 0 ]
我看不出您的第一个版本有什么特别的问题,只是它做了不必要的工作。
在远程执行时,我会怀疑 PATH 问题。因为没有调用交互式 shell,所以很容易假设实际上没有发生初始化。另外,我对 sshpass 一无所知,但你确定你看到的是关于标准错误的消息吗?如果不是,那就可以解释这个谜团了。
看到你的命令,明白了问题。现在我发布我的解决方案版本。
据我了解,您想检查远程主机或多台主机上的磁盘 space,如果磁盘 space 超过 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 个远程主机,然后执行命令检查磁盘 space,它发现 3 个文件系统超出了指定的限制。所以它会生成警报。
脚本:
#!/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 部分。虽然我检查的时候,如果它已经达到 100%,它会忽略任何 FS,但是,添加一个 warning/notification 仍然没有什么坏处。确实是个好主意。
Edit2: 用一个条件更新了 if 循环并添加了 100% 的 echo。后来我意识到之前的循环不匹配数字 71,81,91.