如何记录好友和影响他人
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 | 内核消息 |
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 命令而被宠坏。
在我 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) 毕业于克拉克森大学(位于非常寒冷的纽约州波茨坦),获得计算机科学和技术传播学位。他现在住在纽约州特洛伊,并将大部分空闲时间用于为退伍军人事务部担任程序员。