inetd,xinetd守护进程

Publish: August 31, 2017 Category: Shell,C/C++ No Comments

    inetd, xinetd 为每一个服务都建立侦听socket,当inetd,xinetd收到连接时,它首先确定该socket协议和端口所对应的服务程序,然后fork子进程来启动exec该服务程序,并把连接的通信socket描述符作为标准输入、标准输出和标准错误输出描述符传递给子进程。

    这种方式,不但不需要为每个服务启动独立的服务程序,而且在设计这些服务程序时,还可以避免考虑复杂的socket编程,所需的仅仅是简单的字符串分析。比如telnet、ftp等,都是通过 inetd, xinetd 守护进程来实现的。


xinetd:

  1. 设置文件: /etc/services

# 在文件尾添加一行:
sj    20227/tcp

此文件记录了 xinetd 守护的每个服务的基本信息,包括名称、端口号和协议类型。此例添加了服务 sj 占用TCP协议的20227端口。


  2. 设置文件: /etc/xinetd.d/sj

service sj
{
    socket_type = stream
    protocol    = tcp 
    wait        = no
    user        = root
    only_from   = 198.72.5.0 localhost  
    banner      = /usr/home/grayson/deny_banner
    server      = /usr/home/grayson/sj_server
}

这是一个常见的服务配置文件。我们逐行看一下:

  • 第一行指定这是一个服务并给服务取一个名称。

  • socket_type 描述连接如何工作,常常是 stream(用于 TCP 连接)或 dgram(用于 UDP 服务)。

  • wait 控制 xinetd 是每次处理一个连接 (wait=yes),还是每次处理多个连接 (wait=no)。

  • user 指定守护进程应该作为哪个用户运行。这个用户常常是根用户(超级用户),但是某些服务最好或必须作为服务的创建者运行。

  • only_from 指定哪些系统可以对这个服务发出请求。在这里,只允许 198.72.5 子网上的系统和本地主机使用 sj 服务。最右边的 0 作为通配符;允许 IP 地址前缀为 198.72.5 的任何系统请求服务。可以使用多种表示法指定系统;详情参见 xinetd.conf 手册页。(输入 man 5 xinetd.conf。)如果允许所有就去掉这行!

  • 如果禁止访问,就把 /usr/local/etc/deny_banner 文件的内容发送给客户机。

  • 最后,server 指定允许访问时运行的可执行程序。


  3. 重启服务:

service xinetd restart

    

  4. 服务: sj_server

#include <stdio.h>
int main()
{
    char buf[1024] = {0};
    printf("Welcome!\n");
    fflush(stdout);
    while (1) {
        fgets(buf, sizeof(buf), stdin);     // 读取请求
        printf("Input: %s", buf);           // 返回应答
        fflush(stdout);
        if (strncmp(buf, "exit", 4) == 0)
            break;
    }
    return 0;
}

  5. 编译

# gcc -g -o sj_server sj_server.c


Smail删除队列中的文件

Publish: August 9, 2017 Category: 个人 No Comments

1. 获取队列MID号:

# /var/qmail/bin/smailctl qinfo
Aug 09 06:01:13 +0800 CST mid:63399927918638  size:777  <> 
        remote  123@aabbcc.com
Aug 08 14:30:10 +0800 CST mid:2482662363340  size:2332  <> 
        remote  456@cdef.com

2. 获取该队列的hash位置:

# tree /var/qmail/queue/info/ |grep -B1 63399927918638
├── 4
│   └── 63399927918638

3. 删除信封和信体文件:

# rm -f /var/qmail/queue/info/4/63399927918638
# rm -f /var/qmail/queue/mess/4/63399927918638


一行命令查询出所在hash:

#/var/qmail/bin/smailctl qinfo |grep ' mid:' |awk -F' mid:' '{print $2}' |awk '{print "tree /var/qmail/queue/info |grep -B1 "$1}' |sh
└── 9
    └── 6439711977012
├── 13
│   └── 119909357986622524
├── 15
│   └── 7884062363327
├── 16
│   └── 119909521195720018
├── 19
│   └── 9592328016178
├── 20
│   └── 4882731976441
├── 21
│   ├── 5631502363341
│   ├── 5631502363341
│   └── 64876127918686
│   ├── 74365027918567
│   └── 90805427918544
├── 22
│   ├── 3397551976426
│   ├── 3397551976426
│   ├── 74365027918567

然后再去处理