Linux系统-部署-运维系列导航

C++僵尸进程与孤儿进程 

#include <stdio.h>
#include <unistd.h>
/* 本程序启动一个子进程,父子进程无限循环不退出 */
/*
 * 编译:gcc zombie_creator.c -o zombie_creator.exe
 * 执行:./zombie_creator.exe
 */
/*
 * 使用方法
 * kill父进程,则子进程变为孤儿进程,可以kill子进程解决
 * kill子进程,则子进程变为僵尸进程,可以kill父进程解决
 */
int main() {
        /* fork一个进程,作为子进程 */
        printf( "fork a child process\n" );
        pid_t pid = fork();
        if ( pid > 0 ) {
                /* 父进程 */
            printf( "---i am parent: %d\n", getpid() );
        } else if ( pid == 0 ) {
        /* 子进程 */
        printf( "---i am child: %d\n", getpid() );
        }
        /* 死循环,避免进程退出,方便人为操作模拟孤儿进程与僵尸进程 */
        while ( 1 ) {
        sleep( 1 );
        }
        return(0);
}

 

C++TCP端口监听

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <unistd.h>
//定义端口号 
#define  PORT        5000
#define  LINK_NUM    5
/*
 * 编译:gcc tcp_listener.c -o tcp.exe
 * 执行:./tcp.exe
 */
int main() {
    socklen_t        sock_fd;
    int            new_fd;
    socklen_t        sin_size;
    struct sockaddr_in    host_addr;
    struct sockaddr_in    client_addr;
    /* socket创建失败,网络、资源问题等 */
    if ( (sock_fd = socket( AF_INET, SOCK_STREAM, 0 ) ) == -1 ) {
        perror( "socket" );
        exit( 1 );
    }
    host_addr.sin_family        = AF_INET;
    host_addr.sin_port        = htons( PORT );
    host_addr.sin_addr.s_addr    = INADDR_ANY;
    bzero( &(host_addr.sin_zero), 8 );
    /* 端口占用 */
    if ( bind( sock_fd, (struct sockaddr *) &host_addr, sizeof(struct sockaddr) ) == -1 ) {
        perror( "bind" );
        exit( 1 );
    }
    /* 启动监听失败 */
    if ( listen( sock_fd, LINK_NUM ) == -1 ) {
        perror( "listen" );
        exit( 1 );
    }
    while ( 1 ) {
        sin_size = sizeof(struct sockaddr_in);
        /* 客户端连接失败 */
        if ( (new_fd = accept( sock_fd, (struct sockaddr *) &client_addr, &sin_size ) ) == -1 ) {
            perror( "accept" );
            continue;
        }
        printf( "server:got connection from %s\n", inet_ntoa( client_addr.sin_addr ) );
        /* 为客户端打开一个子进程 */
        if ( !fork() ) {
            /* 向客户端发送消息 */
            if ( send( new_fd, "hello, world, you have connected !\n", 10, 0 ) == -1 ) {
                perror( "send" );
                close( new_fd );
                exit( 0 );
            }
            close( new_fd );
        }
    }
    /* 进程等待结束 */
    while ( waitpid( -1, NULL, WNOHANG ) > 0 )
            ;
    return(0);
}

 

Java测试工具

//1.编辑源文件如HelloWorld.java(java要求文件名与类名一致)
//2.编译 javac HelloWorld.java,输出 HelloWorld.class
//3.执行 java HelloWorld(类名,java会从当前目录class文件查找类的入口函数,但不能指定clsss文件名)

/**特别注意:环境变量 CLASSPATH 需要包括当前目录(.),示例如下
export JAVA_HOME=/usr/local/jdk1.8.0_181
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASSPATH
export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin
export PATH=$PATH:${JAVA_PATH}
**/
import java.util.Date;
import java.text.SimpleDateFormat;
public class HelloWorld {
    public static void main(String []args) {
       System.out.println("Hello World!");
       java.util.Date day = new Date();
       SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
       System.out.println(sdf.format(day));
       //其他java代码
    }
}

 

Python服务扫描工具

#! /usr/bin/python3
# _*_ coding:utf-8 _*_
# python 3.10.5
import socket
import time
'''
使用说明:
安装python 3.10环境,运行脚本即可。
注意linux系统部分组件依赖python,默认集成python2,所以需要独立安装python3(不可覆盖python2),推荐使用windows系统运行。

实现过程:
1.配置待扫描的ip网段列表与端口列表
2.将每个网段按照1-255拼接完整ip,逐个扫描端口列表
3.运行日志在当前目录的run.log,其中返回状态为0表示端口可通,返回其他为不通(可能有10035,10060,10061)
4.扫描结果保存在porton.log,portdown.log,分别表示端口开启、关闭的ip列表
'''

# *********************需要配置的部分********************* #
# ip前缀列表,当前支持掩码 255.255.255
iplist = ["192.168.11"]

# 端口列表
portlist = [80]

# *********************需要配置的部分********************* #


# 获取当前时间字符串
def getTimeNowString() -> str:
    '''
    获取当前本地时间的字符串表示:%Y-%m-%d %H:%M:%S
    '''
    return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())


# 保存列表到文本文件,当前目录
def saveListToFile(fileName: str, list: list) -> None:
    if fileName == "":
        fileName = "temp.log"
    with open(fileName, "w", encoding="utf8") as f:
        f.write(getTimeNowString() + "\n")
        f.writelines([f"{line}\n" for line in list])


# 保存日志
def log(content: str):
    logFile = "run.log"
    with open(logFile, "a+", encoding="utf8") as f:
        f.write(f"{content}\n")


# 端口打开ip列表
portonlist = []

# 端口关闭ip列表
portdownlist = []

# 设置socket默认超时时间,仅对当前进程有效
socket.setdefaulttimeout(1)

# 扫描开始
timeStart = time.time()
log(f"----------------------\n{getTimeNowString()} 开始扫描端口")
for ip in iplist:
    for subip in range(1, 256):
        ipreal = f"{ip}.{subip}"
        for port in portlist:
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            # s.settimeout(2)
            status = s.connect_ex((ipreal, port))
            logstr = f"{ipreal}:{port}={status}"
            log(f"{getTimeNowString()} {logstr}")
            if status == 0:
                portonlist.append(logstr)
            else:
                portdownlist.append(logstr)

            # 及时关闭socket,释放资源
            s.close()

# 保存结果
log(f"{getTimeNowString()} 开始保存端口开启列表")
saveListToFile("porton.log", portonlist)
log(f"{getTimeNowString()} 开始保存端口关闭列表")
saveListToFile("portdown.log", portdownlist)

# 扫描结束
timeEnd = time.time()
timeUsed = timeEnd - timeStart
log(f"{getTimeNowString()} 扫描完成,耗时 {timeUsed:,.0f} 秒!!!")

 

posted on 2023-09-01 13:46  xiaoyaozhe  阅读(17)  评论(0编辑  收藏  举报