嵌入式开发实战:如何在BusyBox系统上快速搭建SSH服务(IMX6UL开发板实测)
嵌入式设备远程管理实战在BusyBox系统上构建轻量级SSH服务对于嵌入式开发者而言设备一旦部署到现场物理接触就变得异常困难。想象一下一个运行在工业现场的IMX6UL网关你需要修改一个配置文件或者查看一下系统日志。难道每次都要跑到现场接上串口线吗这显然不现实。远程访问能力尤其是安全、可靠的远程访问是提升开发效率和后期运维便利性的关键。而SSHSecure Shell协议无疑是这个领域最成熟、最受信任的解决方案。然而嵌入式世界并非服务器世界。我们面对的是资源受限的环境内存可能只有几十到几百兆存储空间以MB计运行的是裁剪到极致的BusyBox系统。在这种环境下直接套用桌面或服务器发行版的SSH方案往往行不通。我们需要的是一个量身定制的、轻量级的SSH服务构建流程。这不仅关乎功能实现更关乎如何在有限的资源下确保服务的稳定与安全。本文将基于IMX6UL开发板和BusyBox-1.36.1根文件系统手把手带你走通从零构建SSH服务的完整路径避开那些我亲自踩过的坑分享一些提升效率的实用技巧。1. 构建环境准备与依赖库交叉编译在开始编译SSH之前一个稳定、配置正确的交叉编译环境是成功的基石。很多编译失败的问题根源都出在环境上。我们首先需要明确目标为ARM架构的IMX6UL处理器编译出能在BusyBox系统上运行的SSH服务及其所有依赖。1.1 工具链与工作目录设置我强烈建议不要在root用户下进行编译工作这能避免很多潜在的权限问题。创建一个独立的、干净的编译工作空间是第一步。# 创建一个专用的SSH编译目录所有操作都在此进行 mkdir -p ~/projects/embedded_ssh cd ~/projects/embedded_ssh export SSH_BUILD_ROOT$(pwd) echo 编译工作根目录设置为: $SSH_BUILD_ROOT接下来是交叉编译工具链。你需要确认你的工具链路径已加入PATH环境变量并且能正确识别目标架构。对于IMX6ULCortex-A7常见的工具链前缀是arm-linux-gnueabihf-。可以通过以下命令验证# 检查交叉编译器是否可用 arm-linux-gnueabihf-gcc --version # 输出应显示gcc版本信息并确认目标为arm-linux-gnueabihf如果工具链未安装你需要根据你的主机系统Ubuntu/CentOS等进行安装。一个常见的做法是使用Linaro或厂商提供的工具链。1.2 编译zlib数据压缩的基础库SSH协议传输过程中会用到压缩zlib是OpenSSH的硬性依赖。我们选择静态编译并将库安装到独立的目录方便后续打包。下载与解压前往zlib官网下载稳定版本例如zlib-1.2.13.tar.gz建议使用较新版本以修复已知漏洞。将其放入工作目录并解压。wget https://zlib.net/zlib-1.2.13.tar.gz -O $SSH_BUILD_ROOT/zlib-1.2.13.tar.gz tar -xzf zlib-1.2.13.tar.gz cd zlib-1.2.13配置与编译关键点在于指定交叉编译器和安装前缀。我们需要修改Makefile来适配交叉编译环境。# 先使用configure生成一个基础的Makefile指定静态库和安装路径 ./configure --prefix$SSH_BUILD_ROOT/install/zlib现在打开生成的Makefile找到并修改以下几行# 原始行可能类似 CCgcc ... ARar ... LDSHAREDgcc -shared ... CPPgcc -E # 修改为注意CC后面添加了 -fPIC 以生成位置无关代码这对后续链接可能有帮助 CCarm-linux-gnueabihf-gcc -fPIC ARarm-linux-gnueabihf-ar LDSHAREDarm-linux-gnueabihf-gcc -shared CPParm-linux-gnueabihf-gcc -E修改完成后执行编译和安装make make install如果一切顺利你会在$SSH_BUILD_ROOT/install/zlib目录下看到include和lib子目录里面包含了我们需要的头文件和静态库libz.a。注意如果在make过程中遇到-fPIC相关错误请检查工具链是否完全支持该选项或者尝试先不添加-fPIC进行编译。1.3 编译OpenSSL加密通信的核心OpenSSL为SSH提供所有加密、解密、密钥交换和证书功能。其编译配置相对复杂需要明确指定目标平台和特性。下载与解压从OpenSSL官网或镜像站下载源码例如openssl-1.1.1w.tar.gz选择长期支持版本。同样解压到工作目录。wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz -O $SSH_BUILD_ROOT/openssl-1.1.1w.tar.gz tar -xzf openssl-1.1.1w.tar.gz cd openssl-1.1.1w配置OpenSSL使用Configure脚本注意大写C。我们需要指定目标平台为linux-generic32适用于32位ARM禁用汇编优化no-asm避免平台特定指令问题并指定交叉编译器和安装路径。# 这是一个关键命令请根据你的实际路径调整 ./Configure linux-generic32 no-asm shared no-async \ --prefix$SSH_BUILD_ROOT/install/openssl \ --cross-compile-prefixarm-linux-gnueabihf- \ -fPIC参数解析linux-generic32: 目标平台配置。no-asm: 禁用汇编代码提高跨平台兼容性。shared: 生成动态链接库.so文件BusyBox环境通常需要。no-async: 禁用异步IO在某些嵌入式环境更稳定。--cross-compile-prefix: 指定交叉编译工具前缀。-fPIC: 生成位置无关代码。编译与安装配置成功后直接执行make和make install。这个过程可能会花费一些时间。make make install安装完成后检查$SSH_BUILD_ROOT/install/openssl目录应包含bin,lib,include等子目录。其中lib目录下的libssl.so和libcrypto.so是SSH运行所必需的。2. OpenSSH的交叉编译与定制化配置依赖库就绪后主角OpenSSH就可以登场了。OpenSSH的编译配置选项非常丰富我们需要根据嵌入式环境的特点进行精简和定制。2.1 获取源码与基础配置从OpenBSD官方镜像站下载便携版portableOpenSSH源码例如openssh-9.6p1.tar.gz。wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.6p1.tar.gz -O $SSH_BUILD_ROOT/openssh-9.6p1.tar.gz tar -xzf openssh-9.6p1.tar.gz cd openssh-9.6p1运行configure脚本这是最关键的一步需要告诉编译器我们所有的依赖库路径和交叉编译信息。./configure --hostarm-linux-gnueabihf \ --with-zlib$SSH_BUILD_ROOT/install/zlib \ --with-ssl-dir$SSH_BUILD_ROOT/install/openssl \ --disable-strip \ --disable-lastlog \ --disable-utmp \ --disable-utmpx \ --disable-wtmp \ --disable-wtmpx \ --disable-syslog \ --disable-etc-default-login \ --prefix/usr/local重要配置选项说明选项作用嵌入式环境考量--host指定目标系统类型必须与工具链前缀匹配--with-zlib指定zlib库路径指向我们之前编译安装的目录--with-ssl-dir指定OpenSSL路径指向我们编译的OpenSSL目录--disable-strip编译后不剥离调试符号便于后期调试发布时可手动strip--disable-lastlog等禁用各种日志功能BusyBox可能不提供这些传统Unix日志文件禁用可避免运行时错误--disable-etc-default-login禁用特定登录检查简化配置避免依赖不存在的文件--prefix/usr/local指定安装前缀注意这里指的是目标板上的路径不是主机路径。提示configure过程会检查很多依赖。如果失败请仔细查看输出日志通常是缺少某个头文件或库。确保之前编译的zlib和OpenSSL的include和lib目录能被正确找到。2.2 编译与生成目标文件配置成功后直接运行make。这里不需要运行make install因为make install会将文件安装到主机的/usr/local目录这不是我们想要的。make编译完成后当前目录下会生成我们需要的所有二进制文件例如ssh、sshd、scp、sftp客户端和服务端主程序ssh-keygen、ssh-agent密钥管理工具sftp-server、ssh-keysign辅助进程3. 文件系统整合与自动化打包策略编译出的二进制文件不能直接扔到开发板上我们需要以一种有组织的方式将它们连同必要的配置文件和运行时库打包成一个易于部署的格式。3.1 创建目标文件系统布局在编译目录下我们模拟目标板的文件系统结构来组织文件。# 回到编译根目录 cd $SSH_BUILD_ROOT # 创建一个临时目录来存放目标文件 mkdir -p target_fs/usr/local/{bin,etc,libexec,sbin} mkdir -p target_fs/usr/lib3.2 编写智能打包脚本手动拷贝文件容易出错一个健壮的Shell脚本能极大提升效率和可靠性。下面这个脚本pack_ssh.sh不仅拷贝文件还处理了密钥生成等必要步骤。#!/bin/bash # pack_ssh.sh - OpenSSH嵌入式部署打包脚本 set -e # 遇到任何错误即退出 # 定义路径 OPENSSH_SRC_DIR$SSH_BUILD_ROOT/openssh-9.6p1 TARGET_FS_DIR$SSH_BUILD_ROOT/target_fs ZLIB_LIB_DIR$SSH_BUILD_ROOT/install/zlib/lib OPENSSL_LIB_DIR$SSH_BUILD_ROOT/install/openssl/lib # 1. 拷贝OpenSSH主程序 echo 正在拷贝OpenSSH可执行文件... BIN_FILESssh scp sftp ssh-add ssh-agent ssh-keygen ssh-keyscan for bin in $BIN_FILES; do if [ -f $OPENSSH_SRC_DIR/$bin ]; then cp $OPENSSH_SRC_DIR/$bin $TARGET_FS_DIR/usr/local/bin/ # 为二进制文件瘦身移除调试符号可选节省空间 arm-linux-gnueabihf-strip $TARGET_FS_DIR/usr/local/bin/$bin echo [OK] $bin else echo [ERROR] $bin 不存在 exit 1 fi done # 2. 拷贝sshd守护进程 if [ -f $OPENSSH_SRC_DIR/sshd ]; then cp $OPENSSH_SRC_DIR/sshd $TARGET_FS_DIR/usr/local/sbin/ arm-linux-gnueabihf-strip $TARGET_FS_DIR/usr/local/sbin/sshd echo [OK] sshd else echo [ERROR] sshd 不存在 exit 1 fi # 3. 拷贝辅助程序 LIBEXEC_FILESsftp-server ssh-keysign for prog in $LIBEXEC_FILES; do if [ -f $OPENSSH_SRC_DIR/$prog ]; then cp $OPENSSH_SRC_DIR/$prog $TARGET_FS_DIR/usr/local/libexec/ arm-linux-gnueabihf-strip $TARGET_FS_DIR/usr/local/libexec/$prog echo [OK] $prog else echo [ERROR] $prog 不存在 exit 1 fi done # 4. 拷贝配置文件 CONFIG_FILESmoduli ssh_config sshd_config for conf in $CONFIG_FILES; do if [ -f $OPENSSH_SRC_DIR/$conf ]; then cp $OPENSSH_SRC_DIR/$conf $TARGET_FS_DIR/usr/local/etc/ echo [OK] $conf else echo [WARN] $conf 不存在将使用默认配置。 fi done # 5. 生成主机密钥如果不存在 echo 正在检查/生成SSH主机密钥... HOST_KEYSrsa dsa ecdsa ed25519 for keytype in $HOST_KEYS; do KEY_FILE$OPENSSH_SRC_DIR/ssh_host_${keytype}_key if [ ! -f $KEY_FILE ]; then echo 生成 ssh_host_${keytype}_key... # 在主机上生成密钥目标板可能没有足够的熵或工具 ssh-keygen -t $keytype -f $KEY_FILE -N -q fi cp $KEY_FILE $TARGET_FS_DIR/usr/local/etc/ cp ${KEY_FILE}.pub $TARGET_FS_DIR/usr/local/etc/ 2/dev/null || true echo [OK] ssh_host_${keytype}_key done # 6. 拷贝依赖的动态库 echo 正在拷贝依赖的动态库... # 查找sshd依赖哪些库 DEPS$(arm-linux-gnueabihf-readelf -d $TARGET_FS_DIR/usr/local/sbin/sshd | grep Shared library | awk -F[ {print $2} | awk -F] {print $1}) for lib in $DEPS; do # 优先从我们编译的目录查找 if [[ $lib libz* ]]; then cp $ZLIB_LIB_DIR/$lib.* $TARGET_FS_DIR/usr/lib/ 2/dev/null || true elif [[ $lib libssl* ]] || [[ $lib libcrypto* ]]; then cp $OPENSSL_LIB_DIR/$lib.* $TARGET_FS_DIR/usr/lib/ 2/dev/null || true else # 其他系统库需要从工具链的sysroot中拷贝 # 此处需要根据你的工具链路径调整 SYSROOT_LIB_PATH$(arm-linux-gnueabihf-gcc -print-sysroot)/lib cp $SYSROOT_LIB_PATH/$lib.* $TARGET_FS_DIR/usr/lib/ 2/dev/null || echo [INFO] 未找到系统库 $lib目标板可能已内置。 fi done echo 打包完成目标文件系统位于: $TARGET_FS_DIR给脚本添加执行权限并运行chmod x pack_ssh.sh ./pack_ssh.sh3.3 制作最终部署包打包脚本运行后target_fs目录下就是我们需要部署到开发板的所有内容。我们可以将其压缩方便传输。cd $SSH_BUILD_ROOT tar -cjf ssh_for_busybox_imx6ul.tar.bz2 -C target_fs .现在ssh_for_busybox_imx6ul.tar.bz2这个文件就包含了完整的、可运行的SSH服务环境。4. 开发板部署、配置与深度调优将打包好的文件传输到开发板可以通过SD卡、NFS、或者scp到已有基础网络服务的目标板然后进行解压和配置。4.1 文件部署与系统集成在开发板终端上操作# 假设压缩包已放在开发板根目录 / cd / tar -xjf ssh_for_busybox_imx6ul.tar.bz2解压后文件会按照usr/local/bin等路径展开。由于我们打包时使用的前缀是/usr/local解压到根目录/后文件自然就位于开发板系统的/usr/local目录下。关键一步检查动态库依赖。使用目标板上的ldd命令BusyBox可能叫lddtree或没有可以用readelf变通检查查看sshd是否能找到所有库。# 在开发板上执行 ldd /usr/local/sbin/sshd 2/dev/null || echo BusyBox可能不支持ldd # 替代方法检查是否存在找不到的库 /usr/local/sbin/sshd --help 21 | grep -i error如果出现“找不到库”的错误需要手动将我们打包的库文件在/usr/lib/下所在的路径添加到系统的库搜索路径中。一个简单粗暴但有效的方法是export LD_LIBRARY_PATH/usr/lib:$LD_LIBRARY_PATH可以将这行命令添加到开发板的启动脚本中例如/etc/profile或/etc/init.d/rcS。4.2 SSH服务配置与启动1. 修改SSH服务器配置编辑/usr/local/etc/sshd_config这是最重要的配置文件。针对嵌入式环境我推荐以下最小化且安全的配置vi /usr/local/etc/sshd_config找到并修改或确保以下行# 允许root登录根据你的安全策略决定调试阶段可以开启 PermitRootLogin yes # 或者更安全的方式PermitRootLogin prohibit-password (仅允许密钥登录) # 禁用密码空值登录 PermitEmptyPasswords no # 使用PAM认证如果BusyBox未编译PAM则禁用 UsePAM no # 禁用DNS反向解析加速连接 UseDNS no # 限制监听的地址默认监听所有接口 # ListenAddress 0.0.0.0 # 设置日志级别 LogLevel INFO # 密钥文件路径指向我们拷贝的位置 HostKey /usr/local/etc/ssh_host_rsa_key HostKey /usr/local/etc/ssh_host_ecdsa_key HostKey /usr/local/etc/ssh_host_ed25519_key2. 创建必要的系统账户和目录SSH守护进程sshd需要以一个特定用户权限运行。我们需要在/etc/passwd和/etc/group文件中添加这个用户如果不存在。# 编辑 /etc/passwd在末尾添加一行 echo sshd:x:74:74:Privilege-Separated SSH:/var/empty/sshd:/sbin/nologin /etc/passwd # 编辑 /etc/group添加sshd组如果不存在 echo sshd:x:74: /etc/group # 创建sshd使用的空目录 mkdir -p /var/empty/sshd chmod 755 /var/empty3. 设置开机自启动编辑BusyBox的初始化脚本/etc/init.d/rcS在文件末尾添加启动命令。vi /etc/init.d/rcS # 在最后添加 /usr/local/sbin/sshd 4. 为root用户设置密码如果尚未设置如果开发板上的root账户没有密码SSH将拒绝密码登录。passwd root # 根据提示输入两次新密码5. 手动启动SSH服务进行测试# 启动前可以先检查配置文件语法 /usr/local/sbin/sshd -t # 如果没有输出错误则启动服务 /usr/local/sbin/sshd -D # 使用-D参数让sshd在前台运行不成为守护进程方便查看日志。测试成功后去掉-D参数。使用ps命令查看sshd进程是否已运行。4.3 连接测试与故障排查在PC端使用SSH客户端如ssh命令、PuTTY、MobaXterm进行连接测试。# 假设开发板IP是 192.168.1.100 ssh root192.168.1.100常见问题与排查思路连接被拒绝 (Connection refused)检查服务是否运行ps | grep sshd检查防火墙BusyBox可能带有iptables检查是否屏蔽了22端口。检查监听端口netstat -tlnp查看22端口是否处于LISTEN状态。权限错误或认证失败检查sshd_config中的PermitRootLogin设置。检查/etc/passwd中sshd用户是否存在。检查密钥文件权限确保/usr/local/etc/ssh_host_*_key文件的权限为600仅所有者可读可写。查看SSH日志启动sshd时加上-d或-dd参数可以输出详细调试信息到终端。/usr/local/sbin/sshd -d -d -d动态库找不到确认LD_LIBRARY_PATH环境变量是否包含/usr/lib。使用readelf -d /usr/local/sbin/sshd | grep NEEDED查看所需库并在开发板上用find / -name libxxx.so*查找。4.4 安全加固与生产环境建议在嵌入式设备上运行SSH安全尤为重要。以下是一些加固建议更改默认端口在sshd_config中修改Port为非22端口减少自动化攻击扫描。禁用密码登录使用密钥认证这是最重要的安全措施。在sshd_config中设置PasswordAuthentication no和PubkeyAuthentication yes。然后使用ssh-keygen在PC端生成密钥对将公钥.pub文件内容添加到开发板的/root/.ssh/authorized_keys文件中。使用非root用户登录创建一个普通用户用于SSH登录然后在需要时使用su或sudo切换权限。限制监听接口如果设备只有特定网口需要被管理使用ListenAddress绑定到具体IP。定期更新关注OpenSSH、OpenSSL的安全公告及时更新到修复了漏洞的版本。整个流程走下来从环境搭建到成功连接你收获的不仅仅是一个可用的SSH服务更是一套针对嵌入式环境进行软件移植和定制的完整方法论。下次面对其他需要在BusyBox上运行的复杂软件时这套依赖管理、交叉编译、打包部署的流程依然具有很高的参考价值。在实际项目中我通常会把这个过程写成Makefile或更复杂的构建脚本实现一键编译打包进一步提升团队协作的效率。

相关新闻

别再只用for循环了!Python列表推导式与filter()函数实战详解

别再只用for循环了!Python列表推导式与filter()函数实战详解

别再只用for循环了!Python列表推导式与filter()函数实战详解 每次看到新手朋友在Python里写列表过滤,十有八九都是一个标准的for循环加上if判断,最后再append到新列表里。代码写出来往往要占五六行,逻辑虽然清晰,但总感…

2026/7/5 1:03:58 阅读更多 →
贾子哲学(Kucius Philosophy):不是新理论,是文明认知操作系统的重装

贾子哲学(Kucius Philosophy):不是新理论,是文明认知操作系统的重装

系统重装:贾子哲学与文明认知操作系统的回归摘要:贾子哲学的本质是一场针对西方中心论认知霸权的“系统重装”:以“思想主权”为公理,拒绝外部认证与话语垄断,确立智慧本身为最高权威;以“本质贯通”为路径…

2026/7/4 8:20:54 阅读更多 →
金融级VS互联网级:用真实业务场景测试TiDB和OceanBase的极限性能

金融级VS互联网级:用真实业务场景测试TiDB和OceanBase的极限性能

金融级VS互联网级:用真实业务场景测试TiDB和OceanBase的极限性能 当你的业务量级从百万级迈向十亿级,当你的交易从“可以慢一点”变成“绝对不能错”,数据库的选择就从技术话题变成了战略决策。TiDB和OceanBase,这两个名字在国产分…

2026/7/4 5:44:37 阅读更多 →

最新新闻

Rust async Drop 难题:资源释放不要藏在未来某个 await 后面

Rust async Drop 难题:资源释放不要藏在未来某个 await 后面

Rust async Drop 难题:资源释放不要藏在未来某个 await 后面 一、Drop 是同步的 Rust 的 Drop trait 是同步执行的,不能直接 await。这在普通资源释放里问题不大,但在异步系统里会变复杂:关闭网络连接、刷盘、通知远端、释放推理会…

2026/7/5 1:56:29 阅读更多 →
Redis Stream 消息队列总结

Redis Stream 消息队列总结

1. Stream 是什么Redis Stream 是 Redis 提供的一种消息队列数据结构,用于保存和传递一系列消息。它的核心特点是:消息有唯一 ID。消息会持久化保存在 Redis 中,不会像 Pub/Sub 一样发送后立刻丢失。支持消费者组。支持消息确认机制。支持查看…

2026/7/5 1:52:27 阅读更多 →
【大白话说Java面试题 第153题】【06_Spring篇】第13题:Spring 中 Bean 是线程安全的吗?

【大白话说Java面试题 第153题】【06_Spring篇】第13题:Spring 中 Bean 是线程安全的吗?

📌 PDF:大白话说Java面试题 — 06_Spring篇 第13题:Spring 中 Bean 是线程安全的吗? 📚 回答: 核心考点: Spring Bean 的线程安全性是并发编程与 Spring 框架交叉的经典问题,大厂面…

2026/7/5 1:50:25 阅读更多 →
Java计算机毕设之美容会员储值充值积分管理系统的设计与实现 美业技师业绩提成统计管理系统(完整前后端代码+说明文档+LW,调试定制等)

Java计算机毕设之美容会员储值充值积分管理系统的设计与实现 美业技师业绩提成统计管理系统(完整前后端代码+说明文档+LW,调试定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/5 1:48:25 阅读更多 →
电容式触摸按键 PCB 设计 10 要点:从 PAD 形状到走线间距的实战避坑

电容式触摸按键 PCB 设计 10 要点:从 PAD 形状到走线间距的实战避坑

电容式触摸按键PCB设计10大核心要点:从焊盘优化到抗干扰布局实战指南在智能家电和消费电子领域,电容式触摸按键正在快速取代传统机械按键。根据行业调研数据,2022年全球电容式触摸控制器市场规模已达12.7亿美元,年复合增长率保持在…

2026/7/5 1:46:23 阅读更多 →
校友质量高的国内EMBA 2026综合实力权威榜单

校友质量高的国内EMBA 2026综合实力权威榜单

一、榜单评测引言随着国内企业全球化布局、数字化转型进程加速,越来越多企业创始人、高层管理者摒弃传统单一管理进修模式,优先选择校友圈层优质、国际化资源充足、学历认可度高的中英双语EMBA项目。优质校友圈层不仅是职场进阶、企业发展的核心人脉资源…

2026/7/5 1:44:23 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻