用于在多个服务器上搜索不同的Shell脚本

时间:2017-02-26 02:18:25

标签: bash shell awk sed solaris

我想在Solaris 10中的多个服务器中搜索不同的包。一个文件包含包信息,另一个文件包含服务器信息。

我试过这个:

bash-3.00# cat pk
"VRTSvcs|VRTSvxfen"
"SUNWfmd|SUNWfsmgtr"

bash-3.00# cat ser
mokshi
niki

这是我的剧本:

bash-3.00# cat tt
#!/usr/bin/bash
>output
for j in `cat ser`
do
for ip in `cat pk`
do

M=`ssh $j  "pkginfo |egrep $ip |cut -d \" \" -f7 "`;
echo "$j " >>output
echo "$M" >>output
done
done

预期输出

cat output
bash-3.00# cat output

moksha

VRTSvcs
VRTSvcsag
VRTSvcsea
VRTSvxfen

niki

SUNWfmd
SUNWfmdr
SUNWfsmgtr

但是当我运行脚本时,它会像这样运行两次:

bash-3.00# bash -x tt

++ cat ser

+ for j in '`cat ser`
'
++ cat pk

+ for ip in '`cat pk`'
++ ssh mokshi 'pkginfo |egrep "VRTSvcs|VRTSvxfen" |cut -d " " -f7 '
Password:
+ M='VRTSvcs
VRTSvcsag
VRTSvcsea
VRTSvxfen'
+ echo 'mokshi '
+ echo 'VRTSvcs
VRTSvcsag
VRTSvcsea
VRTSvxfen'
+ for ip in '`cat pk`'
++ ssh mokshi 'pkginfo |egrep "SUNWfmd|SUNWfsmgtr" |cut -d " " -f7 '
Password:
+ M='SUNWfmd
SUNWfmdr
SUNWfsmgtr'
+ echo 'mokshi '
+ echo 'SUNWfmd
SUNWfmdr
SUNWfsmgtr'
+ for j in '`cat ser`'
++ cat pk
+ for ip in '`cat pk`'
++ ssh niki 'pkginfo |egrep "VRTSvcs|VRTSvxfen" |cut -d " " -f7 '
Password:
+ M='VRTSvcs
VRTSvcsag
VRTSvcsea
VRTSvxfen'
+ echo 'niki '
+ echo 'VRTSvcs
VRTSvcsag
VRTSvcsea
VRTSvxfen'
+ for ip in '`cat pk`'
++ ssh niki 'pkginfo |egrep "SUNWfmd|SUNWfsmgtr" |cut -d " " -f7 '
Password:
+ M='SUNWfmd
SUNWfmdr
SUNWfsmgtr'
+ echo 'niki '
+ echo 'SUNWfmd
SUNWfmdr
SUNWfsmgtr'

我得到这样的输出:

bash-3.00# cat output

moksha

VRTSvcs
VRTSvcsag
VRTSvcsea
VRTSvxfen

moksha

SUNWfmd
SUNWfmdr
SUNWfsmgtr

niki

VRTSvcs
VRTSvcsag
VRTSvcsea
VRTSvxfen
niki

SUNWfmd
SUNWfmdr
SUNWfsmgtr

该脚本的主要目标是从服务器文件中获取一个服务器,并且必须在包文件中搜索第一行。它必须从服务器名称中获取第二个服务器名称,并在包文件中搜索第二行。

请在我犯错的地方帮助我。

1 个答案:

答案 0 :(得分:2)

您可以这样做 - 假设您的服务器和包文件中的行数相同:

#!/usr/bin/env bash
while read -u 3 -r server && read -u 4 -r pkg; do
  m=$(ssh -n "$server" "pkginfo | egrep '$pkg' | cut -d' ' -f7")
  echo "$server"
  echo "$m"
done 3<ser 4<pk >> output
  • 3<ser将fd 3连接到文件ser4<pk将fd 4连接到文件pk
  • read -u 3从文件描述符3读取,read -u 4从文件描述符4读取
  • $()优于后退(请参阅下面的帖子以查找原因)
  • cut -d' ' - &gt;猜你的分隔符是一个空格
  • ssh -n是必需的,以便ssh忽略标准输入并且不会干扰read
  • 最好将>> output放在最后以获得更高效的I / O

另见: