如何记录好友和影响他人

作者:Mark Komarinski

syslog 守护进程(称为 syslogd)用于接收来自 Linux(或其他 Unix)系统各个部分的消息,并将这些消息分发到其他位置。这允许您,管理员,通过保留幕后活动日志来查看系统活动。这是追踪问题和检查系统安全性的好方法。

例如,您可以跟踪严重错误,例如 TCP/IP 问题或内存不足(例如 ghostscript 和 X 失控时)。同时,您可以调试用户遇到的棘手的邮件问题,或者您可以跟踪谁使用了 su 程序来获得 root 权限,并且您还可以找出谁尝试这样做但失败了。

要获取 syslog 程序的副本,请参阅侧边栏,了解如何从您附近的 ftp 站点获取 syslog。

Syslogd 有一个设置文件,名为 /etc/syslog.conf,它告诉 syslogd 要记录哪些消息,以及如何处理它接收的消息。默认情况下(即 /etc/syslog.conf 文件为空),消息不会存储在任何地方。大多数 Linux 发行版都包含 syslog.conf 文件的一些基本设置,并且 syslogd 程序通常在 /etc/rc.d/rc.inet2 文件中启动。

syslog.conf 文件的设置分为三个部分。让我们看一下 syslog.conf 文件的示例

# /etc/syslog.conf
 *.info;*.notice    /usr/adm/messages
 *.debug           /usr/adm/debug
 *.warn            /usr/adm/syslog

第一行是注释。任何以 # 开头或完全空白的行都被视为注释,并被 syslogd 忽略。您可以在这里看到两列,它们之间至少用一个制表符分隔。左侧(包含 *.info;*.notice 的一侧)定义了工具日志级别。右侧定义了消息的目标

工具可以定义为正在运行的程序的“种类”。例如,“mail”是无论您运行 sendmail 还是 smail 都使用的工具。有九个预定义的工具,加上八个本地定义的工具,一个表示“所有工具”的“通配符”工具,以及一个用于发出时间戳的工具。

以下是每个工具的用途

工具

用途

user

用户进程

kern

内核消息

mail

mail

daemon

各种守护进程(例如 ftpd)

auth

授权(例如登录)

lpr

行式打印机

news

USENET 新闻 (nntp)

uucp

UUCP (Unix to Unix copy)

cron

cron 守护进程

mark

为在日志文件中放置时间戳而创建的定期消息

local0-local7

本地定义的工具

*

*

所有工具(mark 除外)

关于 mark 工具的一个特别说明。此工具由 syslogd 每隔 20 分钟以 info 级别创建。这将使您能够快速查看日志文件中的时间变化,并确保 syslogd 正在运行(并记录日志)。如上所述,特殊的 * 工具(表示所有可用工具)不包括 mark。

每个工具都可以具有日志记录(或严重性)级别。这用于指示您要记录的消息类型。高严重性级别(例如 emerg)需要最多的关注,因为 emerg 通常表示程序很快将失败。这些严重性级别的重要性从高到低一直降低到 debug 级别,debug 级别用于正确设置您的软件。一旦您的软件配置正确,您可以将严重性级别更改为更高的级别。查看您的软件文档以了解其对各种级别的解释。从最高严重性到最低严重性:emergalertcriterrwarningnoticeinfodebugnone

mail.debug      /var/adm/syslog.mail
mail.emerg      /var/adm/syslog.mail.emerg

严重性 none 表示不记录来自该工具的任何消息。这些级别表示记录该级别及以上级别的消息。例如,假设您有以下两行

sendmail(或 smail),或任何程序以邮件工具身份记录日志时)向 syslog 发送级别为 debug 的消息时,它将被放置在 syslog.mail 文件中。任何其他消息,从 info 到 emerg 的任何级别,也将被放置在 syslog.mail 中。来自邮件的紧急消息将同时发送到 syslog.mail 和 syslog.mail.emerg。此设置使您可以非常轻松地检查软件的紧急情况,因为只需 glance 在 syslog.mail.emerg 的目录列表中,您就可以知道该文件最近是否已更改,并且您可以轻松地键入 tail/var/adm/syslog.mail.emerg 以 glance 最新的十个条目。此外,您可以在 syslog.mail 中找到紧急消息,并查看围绕它的其他消息,以确定导致紧急消息的事件。

*.alert;user.none       /var/adm/syslog.alert
user.alert              /var/adm/syslog.user.alert

在另一个示例中,我们可以看到“none”严重性级别的用法

在这里,所有严重性级别为 alert 及以上的消息都将发送到 syslog.alert,除了 user 工具中的消息。这些消息将发送到 syslog.user.alert 文件,如第二行指定的那样。

现在您可能想知道行右侧的内容。到目前为止,您已经弄清楚这可以是文件的名称。但它也可以是用户或远程主机的名称。如果消息的预期接收者是一个文件,则文件名必须以 / 开头,表示您必须为文件名提供完整路径。请注意,这可以是几乎任何文件,包括 /dev/console,它会将消息打印到机器的控制台,或 /dev/lp2 以将消息打印在纸上。

#Log mail errors to the mail host for
#the postmaster to deal with
mail.*         @mailhost
#Send kernel emergency warnings to all
#users so they know what's up
kern.emerg     *

如果接收者是远程主机,它将以 @ 开头,后跟主机的名称。预期的主机将通过 TCP/IP 端口 514 接收消息,从此时开始,它就像本地 syslog 的消息一样。发送到远程主机的消息必须通过 syslog 并记录到适当的位置。这将允许您从一个位置监视机器网络。您还可以包含以逗号分隔的用户列表,如果这些用户已登录,消息将打印在这些用户的屏幕上。您还可以包含 *,这意味着每个登录的用户都会收到消息。这对于极端紧急情况非常有用,在这种情况下,您希望用户意识到出了严重问题,他们应该注销。

一旦您设置了 /etc/syslog.conf 文件,您必须首先设置将存储消息的文件,然后重新启动 syslogd

kill -HUP `cat /etc/syslog.pid`

为 syslog 设置文件仅仅意味着查看日志文件的权限。默认情况下,文件设置为 root 用户所有,root 组,每个人都可读,只有 root 用户可写。对于单用户系统,这应该没问题。但是对于多用户系统,其中(可能)包含发送和接收电子邮件的人员的日志,其中许多文件应该只能由 root 用户读取。文件设置的一个好建议是使其对 root 用户可读写,对 wheel 组只读。这允许您设置一些安全性(通过控制谁在 wheel 组中),而无需每次想要检查某些文件时都 `su` 到 root。重新启动 syslogd 不需要杀死 syslogd 程序。所需的只是向进程发送 SIGHUP(信号编号 1),它将重新读取其配置文件。为了进一步帮助您,syslogd 的 PID 存储在 /etc/syslog.pid 文件中。以 root 身份

将重新启动 syslog 守护进程并将您的更改生效。某些 Linux 软件包还包含一个名为 /etc/syslogd.restart 的脚本,它只是一个运行上述 kill 程序的脚本。如果由于某种原因您想实际杀死 syslogd 程序,TERM 信号(或 15)将杀死该程序 (kill -TERM `cat /etc/syslog.pid`)

killall -HUP syslogd

如果您在其中任何一个方面遇到问题,请考虑使用 killall 程序。这是一个 linux 特定的程序,但非常有用

将适用于几乎任何 Linux 机器。唯一可能的问题是,如果您试图学习如何管理 Unix 系统,您可能会因为使用方便但 Linux 特定的 killall 命令而被宠坏。

有关更多信息,请查看 syslogd 和 syslog.conf 的 man 手册。Sendmail 由 O'Reilly & Associates 出版的书(通常被称为“蝙蝠书”,因为它封面上有一张蝙蝠的图片)也专门用了一些页面来介绍 syslog(除了是一本关于配置 sendmail 的好书之外)。

更正

在我 1995 年 1 月的文章 rm 您的乐趣和冒险之路 中,处理取消删除的问题时,我犯了一些关键错误,这些错误被印刷出来。幸运的是,Matt Welsh 发现了一些错误并向我指出了它们。

rm()
{
mv $@ ~/.rm
}

首先,我的 rm 别名有点偏差。它只复制了您提供的第一个文件(如果您给它一个 * 或文件列表作为参数,则使其不可用)。替换它的最佳方法是在 bash shell 中创建一个 shell 函数

mv $@ /tmp/.rm/$LOGNAME

请注意,如果您喜欢将文件存储在最初建议的 /tmp 中,则可以使用 /tmp/.rm/$LOGNAME

/bin/tcsh 使用 $LOGIN 存储用户名。/bin/bash 使用 $LOGNAME。这通常为编写 shell 脚本带来乐趣。如果您使用的 shell 不是 /bin/bash,请先测试它!!

alias waste=/bin/rm
rm()
{
mv $@ ~/.rm
}
if [ ! -e ~/.rm ];
then
  mkdir ~/.rm
  chmod og-rwx ~/.rm
fi

因此,如果您希望将已删除的文件存储在用户的主目录中,则 /etc/profile 应包含以下行

alias waste=/bin/rm
rm()
{
mv $@ /tmp/.rm/$LOGNAME
}
if [ ! -e /tmp/.rm/$LOGNAME ];
then
  mkdir /tmp/.rm/$LOGNAME
  chmod og-rwx /tmp/.rm/$LOGNAME
fi

如果您希望将已删除的文件存储在 /tmp/.rm 下。

使用此方法将为用户带来一些问题

1) 此方法不会保留目录结构。如果用户执行

rm foo
cd ..
rm foo

则只有第二个 foo 文件可用于删除,因为原始 foo 文件已被第二个文件覆盖。

2) 用户习惯的 rm 的某些开关,例如 -r,将不可用,或者可能会执行不同的操作。

3) 确保 /tmp/.rm 具有完整的写入权限,以便用户可以在 /tmp/.rm/$LOGNAME 尚不存在时创建它。

4) 使用第二种方法,如果您删除一个目录,并且 /tmp 和您要删除的目录位于两个不同的文件系统上,mv 将会抱怨跨文件系统移动目录。这可能会发生,但使用第一种方法不太可能发生。

另外,如果您只是键入 crontab,许多版本的 crontab 会将您放入编辑器,而不是我列出的 crontab -l。我的不会,但您的可能会。slackware 使用的 dcron22 将自动将您放入 vi 编辑器。某些其他安装使用的 Vixie Cron 将检查 EDITOR 或 VISUAL 环境变量的值,如果您希望使用其他编辑器。

那么(您可能会问)正在采取什么措施来防止这种情况再次发生?好问题。我正在建立一个小型邮件列表,其中将有一些优秀的 Linux 专家以及一些经验不足的用户作为成员,以便在印刷之前消除任何潜在的困惑或问题。如果您想加入此邮件列表,请发送电子邮件至 komarimf@craft.camp.clarkson.edu 并提出要求。

Mark Komarinski (komarimf@craft.camp.clarkson.edu) 毕业于克拉克森大学(位于非常寒冷的纽约州波茨坦),获得计算机科学和技术传播学位。他现在住在纽约州特洛伊,并将大部分空闲时间用于为退伍军人事务部担任程序员。

加载 Disqus 评论