如何通过跳转服务器在多台服务器上运行相同的查询

如何通过跳转服务器在多台服务器上运行相同的查询

我有很多服务器,如 sdeuu1、sdeuu2、sdeuu3 等。

我想对它们每一个运行一个查询,查询是:

grep -i 'SponsoredLinksIFrame.jsp' /home/nextag/httpd_logs/access_log.1360* | 
  grep -ic 'nextag.co.uk'

当在单独的服务器上运行时,此查询返回完美的结果。

现在我有一台名为 sdalp1 的服务器,我可以通过它 ssh 到 sdeuu1、2、3 等,然后转到该服务器运行查询。现在我不想这样做,而是想从 sdalp1 一次性为所有 sdeuu 服务器运行查询,我尝试了以下命令及其几个其他版本:

for i in sdeuu1 sdeuu2 sdeuu3 sdeuu4 sdeuu5      \
         sdeuu6 sdeuu7 sdeuu8 sdeuu9 sdeuu10     \
         sdeuu11 sdeuu12 sdeuu13 sdeuu14 sdeuu15 \
         sdeuu16 sdeuu17 sdeuu18; do 
  grep -i 'SponsoredLinksIFrame.jsp' /home/nextag/httpd_logs/access_log.1360* | 
    grep -ic 'nextag.co.uk'"
  echo $i
done

但是此命令对所有服务器返回错误,如下所示:

-bash: grep -i 'SponsoredLinksIFrame.jsp' /home/nextag/httpd_logs/access_log.1360* | grep -ic 'nextag.co.uk': No such file or directory 

这里的问题是什么?我不明白这是否是权限问题?

答案1

for i in sdeuu1 sdeuu2 sdeuu3 sdeuu4 sdeuu5      \
         sdeuu6 sdeuu7 sdeuu8 sdeuu9 sdeuu10     \
         sdeuu11 sdeuu12 sdeuu13 sdeuu14 sdeuu15 \
         sdeuu16 sdeuu17 sdeuu18; do 
  ssh $i grep -i 'SponsoredLinksIFrame.jsp' /home/nextag/httpd_logs/access_log.1360* \| \
    grep -ic 'nextag.co.uk'
  echo $i
done

请注意,我ssh $i在循环内添加了命令的开头。

\我还在管道符号 ( ) 后面添加了一个反斜杠 ( ) |,这样第二次 grep 就会在每个单独的服务器上进行,以提高效率。然后,我还需要在该行末尾添加一个反斜杠来表示续行,因为转义的管道符号不再起到这个作用。输入此命令时,请确保在最后一个反斜杠后不要添加任何空格。

如果这令人困惑,您也可以将所有内容放在一行中完成:

for i in sdeuu1 sdeuu2 sdeuu3 sdeuu4 sdeuu5      \
         sdeuu6 sdeuu7 sdeuu8 sdeuu9 sdeuu10     \
         sdeuu11 sdeuu12 sdeuu13 sdeuu14 sdeuu15 \
         sdeuu16 sdeuu17 sdeuu18; do 
  ssh $i grep -i 'SponsoredLinksIFrame.jsp' /home/nextag/httpd_logs/access_log.1360* \| grep -ic 'nextag.co.uk'
  echo $i
done

如果你还没有设置,你可以设置无密码 ssh 登录这样您就不必为每个服务器输入密码。

相关内容