我有一个文件 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 之类的解决方案。