0%

网络活动主机扫描脚本:快速检测局域网内在线设备

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#!/bin/bash

# 配置参数
NETWORK="192.168.0" # 网络前缀
START=1 # 起始IP
END=255 # 结束IP
TIMEOUT=1 # ping超时时间(秒)
COUNT=1 # ping包数量
THREADS=50 # 并发线程数
OUTPUT_FILE="alive_hosts.txt" # 结果保存文件

# 显示脚本使用帮助
usage() {
echo "用法: $0 [选项]"
echo "选项:"
echo " -n <网络前缀> 设置网络前缀(默认: 192.168.0)"
echo " -s <起始IP> 设置起始IP(默认: 1)"
echo " -e <结束IP> 设置结束IP(默认: 255)"
echo " -t <超时时间> 设置ping超时时间(秒)(默认: 1)"
echo " -c <包数量> 设置ping包数量(默认: 1)"
echo " -T <线程数> 设置并发线程数(默认: 50)"
echo " -o <文件> 设置结果输出文件(默认: alive_hosts.txt)"
echo " -h 显示帮助信息"
exit 1
}

# 解析命令行参数
while getopts "n:s:e:t:c:T:o:h" opt; do
case $opt in
n) NETWORK="$OPTARG" ;;
s) START="$OPTARG" ;;
e) END="$OPTARG" ;;
t) TIMEOUT="$OPTARG" ;;
c) COUNT="$OPTARG" ;;
T) THREADS="$OPTARG" ;;
o) OUTPUT_FILE="$OPTARG" ;;
h) usage ;;
*) usage ;;
esac
done

# 检查参数有效性
if [ $START -gt $END ]; then
echo "错误: 起始IP不能大于结束IP"
exit 1
fi

if [ $THREADS -lt 1 ] || [ $THREADS -gt 255 ]; then
echo "错误: 线程数必须在1-255之间"
exit 1
fi

# 初始化结果文件
> $OUTPUT_FILE

# 扫描函数
scan_host() {
local ip="$NETWORK.$1"
# 执行ping命令,静默模式
if ping -c $COUNT -W $TIMEOUT $ip &> /dev/null; then
# 获取主机名(如果能解析)
local hostname=$(nslookup $ip 2>/dev/null | grep 'name =' | awk '{print $4}' | sed 's/\.$//')
if [ -n "$hostname" ]; then
echo "$ip is alive (主机名: $hostname)"
echo "$ip $hostname" >> $OUTPUT_FILE
else
echo "$ip is alive"
echo "$ip" >> $OUTPUT_FILE
fi
fi
}

# 显示扫描信息
echo "开始扫描网络 $NETWORK.$START-$NETWORK.$END ..."
echo "并发线程数: $THREADS, 超时时间: $TIMEOUT秒"
echo "结果将保存至: $OUTPUT_FILE"
echo "----------------------------------------"

# 多线程扫描
for ((i=START; i<=END; i++)); do
scan_host $i &
# 控制并发线程数
while [ $(jobs -r | wc -l) -ge $THREADS ]; do
sleep 0.1
done
done

# 等待所有线程完成
wait

# 显示扫描结果汇总
echo "----------------------------------------"
echo "扫描完成! 共发现 $(wc -l < $OUTPUT_FILE) 台活动主机:"
cat $OUTPUT_FILE

使用示例:

1
2
3
4
5
# 扫描192.168.1.1-100,使用30线程
./scan_alive_hosts.sh -n 192.168.1 -s 1 -e 100 -T 30

# 快速扫描(1个包,0.5秒超时)
./scan_alive_hosts.sh -c 1 -t 0.5

Spring Cloud Config 加密解密:保护敏感配置信息

在分布式系统中,数据库密码、API 密钥等敏感配置需要加密存储,避免明文泄露。Spring Cloud Config 提供了完善的加密解密机制,支持对称加密和非对称加密两种方式,确保敏感信息在传输和存储过程中的安全性。

加密解密的前提准备

Spring Cloud Config 的加密功能依赖 Java 加密扩展(JCE),需先确保环境配置正确:

  1. 下载 JCE
    对于 JDK 8 及以下版本,需手动下载 Java Cryptography Extension (JCE) Unlimited Files

    JDK 9+ 已内置无限制强度的 JCE,无需额外配置。

  2. 安装 JCE
    将下载的 JCE 包中的 local_policy.jarUS_export_policy.jar 复制到 $JAVA_HOME/jre/lib/security/ 目录,覆盖原有文件。

对称加密(Symmetric Encryption)

对称加密使用相同的密钥进行加密和解密,配置简单,适合中小规模系统。

1. 配置加密密钥

在配置中心(Config Server)的 bootstrap.yml 中指定加密密钥:

阅读全文 »

网关:微服务架构的 “交通枢纽”

在微服务架构中,网关(API Gateway)扮演着至关重要的角色,它是客户端与微服务之间的中间层,负责请求路由、负载均衡、安全认证等核心功能。没有网关的微服务系统会面临诸多问题,而网关的引入则能有效解决这些痛点。

没有网关的微服务系统面临的问题

当微服务数量增多且客户端直接与各服务通信时,会出现以下典型问题:

  1. 客户端复杂性飙升
    客户端需要记住每个微服务的地址(如http://service-a:8080http://service-b:8081),并根据业务场景手动选择调用目标。若服务地址变更(如扩容、迁移),客户端需同步修改配置,维护成本极高。
  2. 服务重构适配成本高
    微服务架构中,服务拆分和合并是常态(如将 “用户服务” 拆分为 “用户认证服务” 和 “用户信息服务”)。此时客户端需重新适配新的服务接口和地址,可能导致业务中断。
  3. 安全认证分散
    每个微服务需独立实现认证逻辑(如 Token 校验、权限控制),不仅造成代码冗余,还可能因实现不一致导致安全漏洞(如部分服务遗漏权限校验)。
  4. 运维复杂度高
    • 防火墙配置:需为每个微服务单独开放端口并配置客户端白名单,随着服务数量增加,规则会变得极其繁琐;
    • 监控与日志:客户端请求分散在多个服务,难以统一追踪调用链路和排查问题。
  5. 缺乏流量控制机制
    无法统一限制客户端的请求频率,若某服务遭遇突发流量(如秒杀活动),可能直接被压垮并引发连锁反应(服务雪崩)。

网关的核心功能:解决上述问题的 “一站式方案”

阅读全文 »

Feign 与 Hystrix 整合:服务熔断与降级的实现

Feign 作为声明式 HTTP 客户端,与 Hystrix(熔断框架)的整合是微服务容错的重要手段。通过整合,可在服务调用失败(如超时、服务宕机)时触发熔断或降级,避免级联故障。以下是 Feign 与 Hystrix 的整合细节及实践方式。

Feign 整合 Hystrix 的基础配置

Feign 默认依赖 Hystrix,但默认未启用,需通过配置开启整合:

1. 启用 Hystrix 支持

application.yml中开启 Feign 对 Hystrix 的支持:

1
2
3
feign:
hystrix:
enabled: true # 关键:启用Feign与Hystrix的整合

2. 依赖说明

Spring Cloud 中 Feign 与 Hystrix 的整合依赖已包含在spring-cloud-starter-openfeign中,无需额外引入 Hystrix 核心依赖。若需使用 Hystrix 监控功能,需添加:

阅读全文 »

SSH 自动登录配置:免密码连接服务器的完整步骤

SSH 自动登录通过密钥认证实现,无需每次输入密码即可连接服务器,尤其适合频繁远程操作的场景。以下是详细的配置步骤和注意事项。

在客户端生成密钥对

首先在本地客户端(如你的电脑)生成 SSH 密钥对(公钥和私钥),过程如下:

生成密钥对

使用 ssh-keygen 命令生成,支持 RSA、DSA、ED25519 等算法(推荐 RSA 或 ED25519):

1
2
# 生成 RSA 算法的密钥对(默认路径 ~/.ssh/)
ssh-keygen -t rsa -b 4096 -f ~/.ssh/my_ssh_key
  • -t rsa:指定加密算法为 RSA(安全性高,兼容性好)。
  • -b 4096:密钥长度 4096 位(比默认的 2048 位更安全)。
  • -f ~/.ssh/my_ssh_key:指定密钥文件路径和名称(避免与默认密钥冲突)。

密钥生成过程

执行命令后会出现交互提示:

1
2
3
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): # 按回车(不设置密钥密码,实现完全自动登录)
Enter same passphrase again: # 再次回车确认

生成后,在 ~/.ssh/ 目录下会产生两个文件:

  • my_ssh_key:私钥(重要!不可泄露,仅保存在本地)。
  • my_ssh_key.pub:公钥(需要上传到服务器)。

将公钥上传到服务器

手动上传公钥(通用方法)

步骤 1:登录服务器

先用密码登录到目标服务器(假设服务器 IP 为 192.168.1.100,用户名为 admin):

阅读全文 »