编写 shell 脚本从两个或多个服务器收集日志消息

编写 shell 脚本从两个或多个服务器收集日志消息

在 centos 中使用 shellscript 从更多服务器收集日志消息。

我已经厌倦了一个小脚本来获取日志消息。但问题是当我尝试登录时它不起作用。所以我需要一个脚本,我可以在其中登录不同的服务器并使用该脚本获取日志消息。

下面的脚本是我厌倦的

#!/bin/sh 

echo Enter the count of the server that you need to check for the log messages
read countofserver
for (( c=1; c<=$countofserver; c++ ))
do
echo if you want to continue again press 1 or to quit press any number
read continue
if [ $continue -eq 1 ]
then
echo Enter the ip which you want to login
read loginip
ssh root@$loginip
echo Below are the log messages of the server $loginip
cat /var/log/messages
else
echo exit
fi
done

答案1

我假设您正在使用rsyslog未指定版本的 CentOS。

解决您的问题的最直接的解决方案是使用子系统的每个实现中内置的功能集syslog,使其能够将消息发送到中央服务器。这样就不需要使用任何形式的脚本来复制日志 - 它会自动发生。

可以找到这样一个食谱rsyslog

以下是该文档中的说明的摘要

  1. 发送消息

    将此行添加到适当命名的文件中/etc/rsyslog.d/- 例如,如果您要发送到mushroom使用 IP 地址调用的计算机192.168.10.1,您可以将其称为send_to_mushroom.conf

    # Everything to "mushroom" via port 60514
    *.*  action(type="omfwd" target="192.168.10.1" port="60514" protocol="tcp"
            action.resumeRetryCount="100"
            queue.type="linkedList" queue.size="10000")
    

    如果您只想将事件写入以下内容,请将首字母更改*.*为此消息子集/var/log/messages

    *.=info;*.=notice;*.=warn;auth,authpriv.none;cron,daemon.none;mail.none
    
  2. 接收消息

    取消注释这些行,或将它们添加到配置文件中,例如 /etc/rsyslog.d/from_remotes

    module(load="imtcp")
    input(type="imtcp" port="60514")
    

现在重新启动 的客户端和服务器实例rsyslogd并观察消息滚滚而来。(请记住允许 tcp/50514 通过任何中间防火墙。)

答案2

在这里,ssh root@$loginip将启动一个交互式安全 shell 并等待它退出。之后在cat /var/log/messages本地执行。

您可以输入:

echo Below are the log messages of the server $loginip
ssh root@$loginip cat /var/log/messages

这里,cat /var/log/messages是远程执行的。

scp也可用于复制文件)

请注意,ssh 每次都会询问您密码。您可以使用 ssh 密钥和密钥代理来避免它。

不建议以 root 身份登录。在 Debian 上,/var/log/messagesadm 组的任何成员都可以读取 。您应该使用该组内的普通用户。 (在其他发行版上,请验证ls -l /var/log/messages)。

如果您想退出,请使用exit, not echo exit(仅打印 exit)。

您的脚本未初始化$loginip。您可以将 for 循环替换为while read loginip;do

答案3

我厌倦了它运行良好。它将日志消息分别存储在以其 IP 地址命名的每个文件夹中。

#!/bin/bash

echo Enter the count of the server that you need to check for the log messages
read countofserver
for (( c=1; c<=$countofserver; c++ ))
do
echo Enter the ip which you want to login
read loginip
mkdir /root/logmessages/$loginip -p
scp root@$loginip:/var/log/messages /root/logmessages/$loginip/
done 

相关内容