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} 秒!!!")