我们需要一一读取IP地址,然后检查该服务器上的具体位置

我们需要一一读取IP地址,然后检查该服务器上的具体位置

我有一个文件 ip.txt,其中包含以下详细信息

cat ip.txt
10.10.100.11 10.10.100.12
10.10.100.21 10.10.100.22
10.10.100.101
10.10.100.31 10.10.100.32
10.10.100.201
eof

如果在一行上存在两个 IP,并且使用空格分隔,那么一个可能是活动服务器,另一个是被动服务器,如果只有一个 IP,那么该 IP 仅仅是活动的。

所以我想要脚本来检查文件ip.txt,然后它将仅在该活动服务器上登录并获取输出ps -ef| grep pmon

答案1

您可以使用该awk实用程序从文件的每一行中提取第一个以空格分隔的字段。

对于输出的每个 IP 号awk,shell 可以用来远程ssh执行命令。ps -ef过滤grep不需要在远程主机上进行。

#!/bin/sh

awk '{ print $1 }' ip.txt |
while IFS= read -r remote; do
        printf 'Processing %s...\n' "$remote"
        ssh -n "$remote" ps -ef | grep -F pmon
done

使用-n选项 withssh会阻止它读取剩余的输出awk,否则它会这样做。

使用-F选项 withgrep会使实用程序使用给定模式进行文本字符串比较而不是正则表达式匹配。使用此选项不会改变当前代码的任何内容,也不会使其运行速度更快(该ssh命令可能是此脚本中的瓶颈)。尽管如此,它还是向读者发出信号,表明我们正在使用文本字符串而不是正则表达式进行搜索。


awk通过从循环中的输入文件中读取两个空格分隔的值并忽略其中的第二个值,可以很容易地摆脱此代码。

#!/bin/sh

while read -r remote dummy; do
        printf 'Processing %s...\n' "$remote"
        ssh -n "$remote" ps -ef | grep -F pmon
done <ip.txt

对于管理一组主机的更永久的解决方案,请考虑迁移到 Ansible 之类的解决方案。

相关内容