![ssh 进入主机并运行服务检查脚本](https://linux22.com/image/127733/ssh%20%E8%BF%9B%E5%85%A5%E4%B8%BB%E6%9C%BA%E5%B9%B6%E8%BF%90%E8%A1%8C%E6%9C%8D%E5%8A%A1%E6%A3%80%E6%9F%A5%E8%84%9A%E6%9C%AC.png)
我需要 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"