根据操作系统类型读取IP地址列表并执行命令

时间:2014-03-06 06:58:41

标签: bash shell unix

我正在编写一个脚本来读取具有多个IP地址的文件,登录到每个系统(不涉及ssh密钥并手动输入密码),根据操作系统类型执行命令并打印结果。

以下是在hosts.txt文件中定义IP的方法

#~] cat hosts.txt

10.6.3.131

10.6.3.132

10.6.3.11

10.6.3.12

执行以下脚本时,会显示以下错误。此外,该脚本不会提示列表中的第二个和其他IP。可能导致这种情况的原因是什么?

# ./hq-test1.sh

root@10.6.3.131's password:

awk: cmd. line:1: NR==1{print

awk: cmd. line:1:            ^ unexpected newline or end of string

bash: line 2: [: !=: unary operator expected

10.6.3.131 == PASS

这是测试中使用的脚本:

#!/bin/bash

while read HOST; do

  if ssh root@$HOST '

      STATUS=`awk 'NR==1{print $1}' /etc/*release`

      [ $STATUS != "CentOS" ]

   '; then

       echo "$HOST == FAIL"

  else

       echo "$HOST == PASS"

  fi

done < hosts.txt

2 个答案:

答案 0 :(得分:2)

运行stdin命令时,您的脚本未关闭ssh,因此只处理列表的第一个主机。

我还简化了测试,因为awk能够检查操作系统名称,并且不需要临时变量。

while read host; do
  if ssh -n root@$host '[ "$(awk "/CentOS/{print}" /etc/*release)" ] '
  then
       echo "$host == PASS"
  else
       echo "$host == FAIL"
  fi
done < hosts.txt

答案 1 :(得分:0)

这对我有用。正如我已经写过的那样,这只是一个引用问题。

#!/bin/bash

echo localhost | while read HOST; do

  if ssh root@$HOST '

      STATUS=`awk "NR==1{print \$1}" /etc/*release`

      [ $STATUS != "CentOS" ]

   '; then

       echo "$HOST == FAIL"

  else

       echo "$HOST == PASS"

  fi

done