ssh 进入主机并运行服务检查脚本

ssh 进入主机并运行服务检查脚本

我需要 ssh 并在多个主机上执行服务检查

说主机列表:host1 host2 host3

我编写了如下脚本,但它仅卡在 ssh 上

#!/bin/bash

service=splunk

for host in $(</tmp/tstuf.txt);
do
  ssh $host;
  if (( $(ps -ef | grep -v grep | grep $service | wc -l) > 0 ))
  then
    echo "$service is running"
  else
    echo "$service is not running"
  fi
done

运行脚本时,它正在运行 ssh 并从当前主机转到 host1 并卡在那里。它没有运行服务检查。有人可以建议吗

答案1

您的脚本“仅卡在 ssh 上”,因为您没有给它执行命令。刚刚ssh $host与 建立了一个交互式 ssh 会话$host,然后等待您开始与其交互。

当您exit来自远程主机时,您的脚本将继续并if (( $(ps ....) > 0 )); then .......... fi在您的本地系统上运行。然后继续对列表中的下一个主机进行 for 循环(再次“卡住”,直到退出)。

#!/bin/bash

service=splunk

for host in $(</tmp/tstuf.txt); do
  ssh $host "if (( \$(ps -ef | grep -v grep | grep $service | wc -l) > 0 )); then
               echo $service is running
             else
               echo $service is not running
             fi"
done

或者,正如 @DopeGhoti 所建议的,一个更简单、更好的替代方案是:

#!/bin/sh

service=splunk

for host in $(</tmp/tstuf.txt); do
  # echo -n "$host:"  # optional. uncomment the echo if wanted.
  ssh "$host" service "$service" status
done

更好的选择是安装 LLNL 的并行分布式 Shell 之类的东西PDSH,然后(在配置主机列表文件后/etc/genders)你可以运行如下命令:

pdsh -g all service splunk status

service splunk status在由“all”标签定义的主机组上运行。

pdsh同时在多个主机上运行命令(因此称为“并行分布式 shell”),而不是一次一个。远程系统的每一行输出都以其主机名作为前缀。

例如在我自己的小型家庭网络上:

$ pdsh -g all uptime
kali:  12:09:03 up 3 days, 23:26,  2 users,  load average: 0.08, 0.05, 0.06
hanuman:  12:09:03 up 12 days, 13:09,  2 users,  load average: 0.00, 0.00, 0.00
indra:  12:09:03 up 12 days, 13:05,  2 users,  load average: 0.07, 0.12, 0.09
ganesh:  12:09:03 up 34 days, 23:34, 19 users,  load average: 1.86, 1.48, 1.40

顺便说一句,像上面的例子这样的单行输出uptime可以通过管道传输到例如column -t.多行输出可以通过管道输送到pdsh配套实用程序中按主机名进行分组dshbak

如果您不想一直输入密码,则需要在每个远程主机上设置基于 ssh 密钥的身份验证...就像您的 for 循环或通过 ssh 连接的其他任何内容一样。

pdsh为 debian 和大多数其他 Linux 发行版打包。

答案2

单行内循环。 'pgrep'的返回状态由ssh返回到本地主机。

echo "$host: $service is $(ssh $host pgrep $service >/dev/null || echo "NOT ")running"

相关内容