`
javasee
  • 浏览: 961219 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Linux环境(五)--主机信息与日志

阅读更多
主机信息

正如我们可以确定用户信息一样,程序也可以确定其运行的计算机的信息。uname命令提供了这些信息。uname同时也作为一个系统调用来在一个C程序中提供同样的信息,我们可以使用man 2 uname来查看详细的信息。

许 多情况都需要主机信息。我们也许希望依据在网络中一个程序所运行的机器的名字来自定义其行为,也就是说,是一个学生的机器还是一个管理员的机器。为了授权 的目的,我们也许希望限制一个程序只在一台机器上运行。所有这些都意味着我们需要一个方法来确定程序所运行的机器的信息。

如果系统安装了网络组件,那么我们可以非常容易的通过gethostname函数来得到其网络名:

#include <unistd.h>
int gethostname(char *name, size_t namelen);

gethostname函数将机器的网络名写入name所指的字符串中。假定这个字符串的长度至少为namelen字符长。如果成功,gethostname函数会返回0,否则会返回-1。

我们可以由uname系统调用得到关于主机的更为详细的信息:

#include <sys/utsname.h>
int uname(struct utsname *name);

uname函数将主机信息写入由name参数所指向的结构。utsname结构定义在sys/ustname.h中,大多数至少包含下列成员:

成员 描述
char sysname[] 操作系统名
char nodename[] 主机名
char release[] 系统发行级别
char version[] 系统版本号
char machine[] 硬件类型

如果成功,uname函数会返回一个非负数,否则返回-1,同时设置errno来指示错误。

试验--主机信息

下面是一个程序,hostget.c,来得到主机信息:

#include <sys/utsname.h>
#include <unistd.h>
#include <stdio.h>
int main()
{
char computer[256];
struct utsname uts;
if(gethostname(computer, 255) != 0 || uname(&uts) < 0) {
fprintf(stderr, “Could not get host information\n”);
exit(1);
}
printf(“Computer host name is %s\n”, computer);
printf(“System is %s on %s hardware\n”, uts.sysname, uts.machine);
printf(“Nodename is %s\n”, uts.nodename);
printf(“Version is %s, %s\n”, uts.release, uts.version);
exit(0);
}

程序会产生如下的Linux特定的输出。如果我们的机器处在网络中,我们就会发现一个包含网络的扩展主机名:

$ ./hostget
Computer host name is beast
System is Linux on i686 hardware
Nodename is beast
Version is 2.4.19-4GB, #1 Wed Nov 27 00:56:40 UTC 2002

工作原理

这个程序会调用gethostname函数来得到主机的网络名。在前面的例子中,其得到的名字为tilde。更为详细的信息是由unmae函数调用得到的。注意,函数uname所返回的字符串是依赖于实现的;在这个例子中,版本号包含所编译的内核的数据。

由gethostid函数可以得到一个唯一的主机号:

#include <unistd.h>
long gethostid(void);

gethostid函数会返回一个唯一的主机号。授权管理通常使用这个函数来确保软件程序只可以运行一个具有合法授权的机器上。在Sun工作站上,他会返回一个机器在制造时在不可变内存中设置的一个数,所以,对于系统硬件,这是唯一的。

其他的系统,例如Linux,会返回一个基于机器网络地址的值,通常对于授权是足够安全的。

日志

许多程序需要记录他们的动作。系统程序通常将信息写入终端或是一个日志文件。这些信息也许指示错误,警告,或是关于系统状态的更一般的信息。例如,su程序也许会记录一个用户尝试获得超级权限并且失败的事实。

通 常,这些日志信息会记录在一个目录中的一个系统文件中。这也许是/usr/adm或者是/var/log。在通常的Linux安装中, /var/log/messages文件包含系统信息,/var/log/mail包含其他的邮件系统的日志信息,/var/log/debug包含调试 信息。我们可以在/etc/syslog.conf文件中查看我们的系统配置。

如下面的是一些日志信息:

Here are some sample log messages:
Feb 8 08:38:37 beast kernel: klogd 1.4.1, log source = /proc/kmsg started.
Feb 8 08:38:37 beast kernel: Inspecting /boot/System.map-2.4.19-4GB
Feb 8 08:38:37 beast kernel: Loaded 20716 symbols from /boot/System.map-
2.4.19-4GB.
Feb 8 08:38:37 beast kernel: Symbols match kernel version 2.4.19.
Feb 8 08:38:37 beast kernel: Loaded 372 symbols from 17 modules.
Feb 8 08:38:37 beast kernel: Linux Tulip driver version 0.9.15-pre11 (May 11,
2002)
Feb 8 08:38:37 beast kernel: PCI: Found IRQ 5 for device 00:0d.0
Feb 8 08:38:37 beast kernel: eth0: ADMtek Comet rev 17 at 0xe400,
00:04:5A:5F:46:52, IRQ 5.
...
Feb 8 08:39:20 beast /usr/sbin/cron[932]: (CRON) STARTUP (fork ok)
Feb 8 09:50:35 beast su: (to root) neil on /dev/pts/4

从这里我们可以看到日志记录的信息。前面的一些是当内核启动并检测安装的硬件时由内核自身报告的。任务调用度器,cron,报告他正是启动。最后,su程序报告用户neil访问一个超级帐户。

一些Unix系统并不会以这种可读的方式提供日志信息,而是提供管理员工具来读取系统事件的数据库。我们可以查看我们的系统文档来得到详细的信息。

尽管系统信息的格式和存储会改变,但是产生这些信息的方法是标准的。Unix系统使用syslog函数来为日志信息的产生提供一个接口:

#include <syslog.h>
void syslog(int priority, const char *message, arguments...);

syslog函数将日志信息发送到日志工具。每一个消息有一个priority参数,他是由安全级别与工具值的位或者到的。安全级别控制这些消息如何产生,而工具值记录消息源。

工具值包括LOG_USER,用来表明消息来自于一个用户程序,LOG_LOCAL0,LOG_LOCAL1直到LOG_LOCAL7,这可以由本地管理员赋于其意义。

下表列出以降序表达的安全级别:

安全级别 描述
LOG_EMERG 一个紧急事件
LOG_ALERT 高优先级问题,例如数据库崩溃
LOG_CRIT 紧急错误,例如硬件失败
LOG_ERR 错误
LOG_WARNING 警告
LOG_NOTICE 需要引起注意的特殊情况
LOG_INFO 信息消息
LOG_DEBUG 调试消息


依据于我们的系统配置,LOG_EMERG消息也许会广播给所有用户,LOG_ALERT消息也许会用邮件发送给管理员,LOG_DEBUG消息会被忽略,而其他的消息会被写入日夜。我们可以编写一个简单的程序,在我们希望创建一个日志消息时可调用syslog日志程序。

由syslog 所创建的日志消息由一个消息头与消息体组成。消息头是由程序指示器与日期和时间创建的。消息体是由到syslog的消息参数创建的,其作用类似于 printf格式化字符串。传递给syslog的其余参数用于在消息字符串中指定printf样式的约定。另外,指示器%m可以用于插入与当前的错误变量 errno相关联的错误消息字符串。这对于记录错误消息十分有用。

试验--syslog

在这个程序中,我们试图打开一个不存在的文件:

#include <syslog.h>
#include <stdio.h>
int main()
{
FILE *f;
f = fopen(“not_here”,”r”);
if(!f)
syslog(LOG_ERR|LOG_USER,”oops - %m\n”);
exit(0);
}

当我们编译并运行程序syslog.c时,我们不会看到任何输出,但是文件/var/log/messages中现在却包含下面的记录:

Feb 8 09:59:14 beast syslog: oops - No such file or directory

工作原理

在这个程序中,我们试图打开一个不存在的文件。当操作失败时,我们会看到syslog在系统日志中记录这件事情。

我们可以注意到日志消息并没有指明是哪个程序调用日志程序;他只是记录syslog被一条消息调用的事实。%m格式约定已经被一个错误描述所代替,在这个例子中,这个文件不可以找到。这与只是打印出原始的错误号要有用得多。

在syslog.h中还定义了其他的一些可以用来修改日志程序行为的函数。他们是:

#include <syslog.h>
void closelog(void);
void openlog(const char *ident, int logopt, int facility);
int setlogmask(int maskpri);

我 们可以通过调用openlog函数来修改我们的日志消息所表示的方式。这会让我们设置一个字符串,ident,这会添加到我们日志消息的前面。我们可以使 用他来表明是哪个程序创建这条消息。facility参数记录了一个syslog调用将来要使用的参数值。默认为LOG_USER。logopt参数配置 了将来的syslog调用的行为。他们下面的零个或是多个位或的结果:

logopt参数 描述
LOG_PID 在消息中包含进程标识符,这是由系统分配给进程的唯一标识号
LOG_CONS 如果消息不可以被记录就发送到终端
LOG_ODELAY 在第一次调用时打开log程序
LOG_NDELAY 立即打开log程序,而不是第一次调用时

openlog函数会分配并且打开一个用于写入日志程序的文件描述符。我们可以调用closelog函数将其关闭。注意,在调用syslog函数之前并不需要调用openlog,因为syslog本身会在需要的时候打开。

我们可以使用setlogmask函数来设置日志掩码从而控制我们日志消息的优先级别。以后那些使用在日志掩码中没有设置的优先级调用syslog函数都会被拒绝,例如,我们可以使用这个方法关闭LOG_DEBUG消息,而不需要修改程序体。

我们可以使用LOG_MASK(priority)来为日志消息创建掩码,这会创建一个只包含一个优先级的掩,或是LOG_UPTO(priority),这会创建一个包含直到priority且包含priority的所有优先级的掩码。

试验--logmask

在这个例子,我们会实际的看一下logmask的使用:

#include <syslog.h>
#include <stdio.h>
#include <unistd.h>
int main()
{
int logmask;
openlog(“logmask”, LOG_PID|LOG_CONS, LOG_USER);
syslog(LOG_INFO,”informative message, pid = %d”, getpid());
syslog(LOG_DEBUG,”debug message, should appear”);
logmask = setlogmask(LOG_UPTO(LOG_NOTICE));
syslog(LOG_DEBUG,”debug message, should not appear”);
exit(0);
}

这个logmask.c程序并不会产生任何输出,但是在特定的Linux系统上,在/var/log/messages的结束处,我们会看到下面的行:

Feb 8 10:00:50 beast logmask[1833]: informative message, pid = 1833

配置用来接收调试日志消息的文件应包含下面的行:

Feb 8 10:00:50 beast logmask[1833]: debug message, should appear

工作原理

程 序使用他的名字,logmask来初始化日志程序,并且请求消息中包含进程标识符。信息消息被记录到/var/log/messages,而调试信息记录 到/var/log/debug文件中。第二个调试信息并不会出现,因为我们调用setlogmask函数忽略了所有优先级小于LOG_NOTICE的消 息。

如果我们的安装没有记录调试信息的功能,或者是进行了不同的配置,那么我们也许不会看到调试消息的输出。为了允许所有的调试消息,在/etc/syslog.conf的最后加入下面一行并重启。然而,一定要查看我们的系统文档来得到确切的配置方法:

*.debug /var/log/debug

logmask.c使用了getpid函数,他与其相关的getppid的函数定义如下:

#include <sys/types.h>
#include <unistd.h>
pid_t getpid(void);
pid_t getppid(void);

这两个函数会返回调用进程的及其父进程的进程标识符。要了解更多的关于PID的内容,可以查看第11章。
分享到:
评论

相关推荐

    sigar-linux依赖 libsigar-amd64-linux.so

    `libsigar-amd64-linux.so` 是一个动态链接库,其中包含了一系列用于与各种操作系统接口交互的函数。这些函数允许开发者获取关于内存使用、进程状态、网络连接、CPU负载等系统级别的信息。AMD64表示这是为x86-64架构...

    sysklogd-1.4.1.rar_linux 日志_linux 日志_sysklogd-1.4.1_系统日志 windo

    3. **日志转发**:sysklogd可以配置为将日志信息转发到远程服务器,实现日志的集中管理和分析,这对于多主机环境尤其有用。 4. **日志等级**:sysklogd支持多种日志等级,如 emerg、alert、crit、err、warning、...

    Linux环境下的日志分析系统LASL.pdf

    LASL系统结合了移动Agent技术与传统日志分析技术的优点,能够在Linux环境中高效地进行日志收集、分析和响应。通过智能化、自动化的设计,LASL能够显著提升网络安全管理和应急响应的能力。此外,该系统还展示了如何...

    最新版linux apache-tomcat-7.0.104.tar.gz

    "linux"表明它是与Linux系统相关的,"apache"指的是Apache软件基金会,Tomcat是其维护的一个项目。"tomcat"则直接指代了这款应用服务器,"7.0.104"再次强调了软件的具体版本。 【压缩包子文件的文件名称列表】:...

    分析linux主机操作系统加固规范.pdf

    总之,Linux主机操作系统的加固是一个全面的过程,涉及多个层面,需要综合考虑账号、口令、文件权限及系统服务等多个方面,通过严格的管理和策略,构建一个安全、稳定的运行环境。遵循这些规范,可以显著降低系统...

    linux-101-hacks

    - **PuTTY**:PuTTY是Windows平台上的SSH客户端,提供了与Linux系统进行SSH连接的工具。 ### 第四章 - 日期设置 - **设置系统时间**:介绍了如何设置系统的当前时间。 - **设置硬件时间**:介绍了如何设置计算机...

    linux主机操作系统加固规范参考.pdf

    Linux主机操作系统加固规范是保障系统安全的重要步骤,它涉及到多个层面,包括账号管理、认证授权、口令策略以及文件和权限设置等。本规范旨在提供一套详细的指导原则,以增强Linux系统的安全性,防止未授权访问和...

    最新版linux elasticsearch-8.5.2-linux-x86-64.tar.gz

    Elasticsearch 8.5.2 是一个...总之,Elasticsearch 8.5.2 在 Linux 环境下提供了一套强大且灵活的搜索和分析解决方案。通过正确配置和合理使用,你可以充分利用它的能力来处理大量数据,实现高效的数据管理和洞察。

    Linux-+-Apache-+-MySQL-+-PHP-(LAMP)环境搭建推荐教程.docx

    **二、系统环境部署与调整** 1. **系统检查** - 通过`more /var/log/messages`查看系统级错误信息。 - 使用`dmesg`检查硬件设备错误信息。 - `ifconfig`检查网络接口配置。 - `ping www.163.com`测试网络连通性...

    linux学习笔记--很经典

    ### Linux系统结构与目录详解 #### 一、Linux系统概述 Linux是一种自由开源的操作系统,以其高度稳定性和安全性被广泛应用于服务器领域。本篇“Linux学习笔记”详细介绍了Linux的基本目录结构及其各自的功能,这...

    CMT-Linux-Example-Src.zip_linux 陀螺仪_linux数据采集_linux采集

    总的来说,"CMT-Linux-Example-Src.zip"提供了一个完整的框架,展示了如何在Linux环境下与MTi-G陀螺仪进行有效交互并实现数据采集。通过深入研究和理解这些源代码,开发者可以进一步优化性能,适应各种复杂的应用...

    最新版linux kibana-8.3.3-linux-x86_64.tar.gz

    Linux Kibana 8.3.3 是一个强大的开源数据可视化和分析工具,主要用于与Elasticsearch协同工作,提供交互式的数据探索和仪表板功能。Kibana是Elastic Stack的重要组成部分,允许用户通过Web界面直观地理解存储在...

    Linux复习题-判断题

    * netstat命令用来显示各种各样的与网络相关的状态信息,它的主要用途有:察看网络的连接状态(对TCP及UDP协议)。 五、文件权限 * 文件权限读、写、执行的三种标志符号依次是rwx。 * 改变文件所有者的命令为chown...

    linux日志管理,进行linux的日志管理

    Linux日志管理是系统维护和故障排查的重要组成部分,它记录了操作系统中发生的各种事件,包括用户登录、系统错误、网络活动等。日志管理的主要功能有审计和监测,它可以帮助系统管理员监控系统状态,及时发现和处理...

    BIG-IP系统Linux主机部分内存问题故障排除方法

    在面对BIG-IP系统Linux主机部分的内存问题时,需要综合使用多种工具和技术手段进行诊断与排查。通过`free`、`top`和`slabtop`等命令,可以有效地监控和定位内存使用中的问题。此外,及时关注官方文档和社区支持,也...

    Linux -lgthread-2.0缺失时要用的arm64下的链接库

    如果以上步骤仍无法解决问题,可能需要查看编译日志,查找更具体的错误信息。可能的问题包括版本不兼容、库文件损坏、依赖关系未满足等。根据错误信息调整编译配置或搜索相关解决方案。 总之,解决`-lgthread-2.0`...

    filebeat-7.0.0-linux-x86_64.tar.gz elasticsearch配套使用的组件,可收集数据

    3. 如果Elasticsearch不在本地运行,你需要配置output.elasticsearch部分,包括主机地址、端口、认证信息等。 集成Elasticsearch与Kibana: 1. Filebeat与Elasticsearch的配合使得日志数据能够快速、高效地进行存储...

    Linux系统移植-Uboot

    1. **主机硬件环境**:通常指开发人员使用的PC机或工作站,需要具备足够的计算能力和存储空间来支持编译和调试过程。 2. **目标板硬件环境**:指嵌入式系统的硬件平台,包括处理器类型(如ARM)、内存大小、外设接口...

    最新版linux kibana-8.5.3-linux-x86-64.tar.gz

    Linux Kibana 8.5.3 是一个强大的开源数据可视化工具,主要用于配合Elasticsearch进行日志分析、监控和数据探索。Kibana作为Elastic Stack(以前称为ELK Stack,包括Elasticsearch、Logstash和Kibana)的重要组成...

Global site tag (gtag.js) - Google Analytics