opencascade AIS_Manipulator源码学习
前言
AIS_Manipulator 是 OpenCASCADE 库中的一个类,用于在3D空间中对其他交互对象或一组对象进行局部变换。该类提供了直观的操控方式,使用户可以通过鼠标进行平移、缩放和旋转等操作。

详细功能
交互对象类,通过鼠标操控另一个交互对象或一组对象的局部变换。
它管理3D空间中的三种操作类型:
- 通过轴进行平移
- 轴内缩放
- 围绕轴旋转
要启用这些模式之一,需要激活选择模式(从1到3)。
操作器的位置信息定义了三个正交变换轴。可以为每个轴或所有轴禁用特定的变换模式。
此外,每个轴可以被隐藏或显示。
以下步骤演示了如何为交互对象附加、配置和使用操作器:
步骤1. 创建操作器对象并调整其外观:
Handle(AIS_Manipulator) aManipulator = new AIS_Manipulator();aManipulator->SetPart (0, AIS_Manipulator::Scaling, Standard_False);aManipulator->SetPart (1, AIS_Manipulator::Rotation, Standard_False);
// 将操作器附加到已显示的对象,并管理操作模式
aManipulator->AttachToObject (anAISObject);aManipulator->EnableMode (AIS_Manipulator::Translation);aManipulator->EnableMode (AIS_Manipulator::Rotation);aManipulator->EnableMode (AIS_Manipulator::Scaling);
请注意,你可以只启用一种操作模式,但显示所有的可视部分。
这段代码允许你查看操作器并选择其操作部分。
请注意,操作器在部分选择时激活模式。
如果此模式已激活,则不会对操作器进行选择。
它可以通过高亮显示激活。启用此功能:
aManipulator->SetModeActivationOnDetection (Standard_True);
步骤2. 在事件处理链中使用以下代码对对象进行变换:
// 捕捉鼠标按下事件
if (aManipulator->HasActiveMode()){aManipulator->StartTransform (anXPix, anYPix, aV3dView);}
…
// 或者跟踪鼠标移动事件
if (aManipulator->HasActiveMode()){aManipulator->Transform (anXPix, anYPix, aV3dView);aV3dView->Redraw();}
…
// 或者捕捉鼠标释放事件(应用)或逃逸事件(取消)
aManipulator->StopTransform(/*Standard_Boolean toApply*/);
步骤3. 要停用当前操作模式使用:
aManipulator->DeactivateCurrentMode();
步骤4. 要从对象上分离操作器使用:
aManipulator->Detach();
最后一个方法会删除操作器对象。
AIS_Manipulator 是 OpenCASCADE 库中的一个类,用于在3D空间中对其他交互对象或一组对象进行局部变换。该类提供了直观的操控方式,使用户可以通过鼠标进行平移、缩放和旋转等操作。以下是 AIS_Manipulator 类的详细介绍:
主要功能
AIS_Manipulator 管理 3D 空间中的三种主要变换操作:
- 平移:沿着指定的轴进行移动。
- 缩放:沿着指定的轴进行缩放。
- 旋转:围绕指定的轴进行旋转。
变换模式
要启用某种变换模式,需要激活对应的选择模式(从 1 到 3)。操作器的位置信息定义了三个正交变换轴。可以为每个轴或所有轴禁用特定的变换模式。此外,每个轴可以被隐藏或显示。
方法
使用步骤
步骤 1: 创建并配置操作器对象
Handle(AIS_Manipulator) aManipulator = new AIS_Manipulator();
aManipulator->SetPart (0, AIS_Manipulator::Scaling, Standard_False);
aManipulator->SetPart (1, AIS_Manipulator::Rotation, Standard_False);
步骤 2: 将操作器附加到对象并管理操作模式
aManipulator->AttachToObject (anAISObject);
aManipulator->EnableMode (AIS_Manipulator::Translation);
aManipulator->EnableMode (AIS_Manipulator::Rotation);
aManipulator->EnableMode (AIS_Manipulator::Scaling);
步骤 3: 启用检测时激活模式
aManipulator->SetModeActivationOnDetection (Standard_True);
步骤 4: 在事件处理链中使用操作器进行变换
// 捕捉鼠标按下事件
if (aManipulator->HasActiveMode())
{aManipulator->StartTransform (anXPix, anYPix, aV3dView);
}
// 跟踪鼠标移动事件
if (aManipulator->HasActiveMode())
{aManipulator->Transform (anXPix, anYPix, aV3dView);aV3dView->Redraw();
}
// 捕捉鼠标释放事件(应用)或逃逸事件(取消)
aManipulator->StopTransform(/*Standard_Boolean toApply*/);
步骤 5: 停用当前变换模式
aManipulator->DeactivateCurrentMode();
步骤 6: 从对象上分离操作器
aManipulator->Detach();
代码示例
下面是一个完整的示例,演示如何使用 AIS_Manipulator 来操控一个交互对象:
#include <AIS_Manipulator.hxx>
#include <AIS_Shape.hxx>
#include <V3d_View.hxx>
#include <Geom_CartesianPoint.hxx>
#include <TopoDS_Shape.hxx>
#include <BRepPrimAPI_MakeBox.hxx>// 创建一个形状
TopoDS_Shape aBox = BRepPrimAPI_MakeBox(100, 100, 100).Shape();
Handle(AIS_Shape) anAISObject = new AIS_Shape(aBox);// 创建并配置操作器
Handle(AIS_Manipulator) aManipulator = new AIS_Manipulator();
aManipulator->SetPart (0, AIS_Manipulator::Scaling, Standard_False);
aManipulator->SetPart (1, AIS_Manipulator::Rotation, Standard_False);// 将操作器附加到对象并启用操作模式
aManipulator->AttachToObject(anAISObject);
aManipulator->EnableMode(AIS_Manipulator::Translation);
aManipulator->EnableMode(AIS_Manipulator::Rotation);
aManipulator->EnableMode(AIS_Manipulator::Scaling);// 启用检测时激活模式
aManipulator->SetModeActivationOnDetection(Standard_True);// 在事件处理中进行变换
// 捕捉鼠标按下事件
if (aManipulator->HasActiveMode())
{aManipulator->StartTransform(anXPix, anYPix, aV3dView);
}
// 跟踪鼠标移动事件
if (aManipulator->HasActiveMode())
{aManipulator->Transform(anXPix, anYPix, aV3dView);aV3dView->Redraw();
}
// 捕捉鼠标释放事件(应用)或逃逸事件(取消)
aManipulator->StopTransform(/*Standard_Boolean toApply*/);// 停用当前变换模式
aManipulator->DeactivateCurrentMode();// 从对象上分离操作器
aManipulator->Detach();
通过以上步骤和示例代码,用户可以在 OpenCASCADE 应用中使用 AIS_Manipulator 类来实现对三维对象的直观变换操作。
示例
1
构造一个具有默认位置并显示所有部分的操作器对象。
Standard_EXPORT AIS_Manipulator();
2
构造一个具有输入位置和轴位置并显示所有部分的操作器对象。
Standard_EXPORT AIS_Manipulator (const gp_Ax2& thePosition);
3
禁用或启用某个轴上的平移、旋转或缩放的可视部分。
3
默认情况下所有部分都是启用的(将显示)。
启用或禁用操作器的可视部分不会管理操作(选择)模式。
如果轴索引 < 0 或 > 2,则会引发程序错误。
Standard_EXPORT void SetPart (const Standard_Integer theAxisIndex, const AIS_ManipulatorMode theMode, const Standard_Boolean theIsEnabled);
4
禁用或启用所有轴上的平移、旋转或缩放的可视部分。
默认情况下所有部分都是启用的(将显示)。
启用或禁用操作器的可视部分不会管理操作(选择)模式。
如果轴索引 < 0 或 > 2,则会引发程序错误。
Standard_EXPORT void SetPart (const AIS_ManipulatorMode theMode, const Standard_Boolean theIsEnabled);
5
附加到输入的交互对象并在相同的上下文中显示。
它被放置在对象边界框的中心,其大小调整为对象边界框。
Standard_EXPORT void Attach (const Handle(AIS_InteractiveObject)& theObject, const OptionsForAttach& theOptions = OptionsForAttach());
6
附加到输入的交互对象组并在相同的上下文中显示。
它附加到第一个对象,但管理整个组的操作。
它被放置在对象边界框的中心,其大小调整为对象边界框。
Standard_EXPORT void Attach (const Handle(AIS_ManipulatorObjectSequence)& theObject, const OptionsForAttach& theOptions = OptionsForAttach());
7启用操作模式。
它在当前上下文中激活选择模式。
如果操作器未显示,则不会激活任何模式。
Standard_EXPORT void EnableMode (const AIS_ManipulatorMode theMode);
8
启用检测时激活模式(高亮显示)。
默认情况下,模式在选择操作器部分时激活。
如果启用此模式,选择部分将不起作用。
void SetModeActivationOnDetection (const Standard_Boolean theToEnable)
9
如果手动模式激活已启用,则返回 true。
Standard_Boolean IsModeActivationOnDetection() const
10
在查看器中拖动对象。
theCtx [in] 交互上下文
theView [in] 活动视图
heOwner [in] 检测到的实体所有者
theDragFrom [in] 拖动起点
theDragTo [in] 拖动终点
theAction [in] 拖动操作
如果对象拒绝拖动操作(例如 AIS_DragAction_Start),则返回 FALSE
Standard_EXPORT virtual Standard_Boolean ProcessDragging (const Handle(AIS_InteractiveContext)& theCtx,
const Handle(V3d_View)& theView,
const Handle(SelectMgr_EntityOwner)& theOwner,
const Graphic3d_Vec2i& theDragFrom,
const Graphic3d_Vec2i& theDragTo,
const AIS_DragAction theAction) Standard_OVERRIDE;
11
初始化起始(参考)变换。
它在链中与 StartTransform-Transform(gp_Trsf)-StopTransform 一起使用,
仅用于自定义变换集。如果使用 Transform(const Standard_Integer, const Standard_Integer),
初始数据会自动设置,并在 DeactivateCurrentMode 调用时重置(如果尚未重置)。
Standard_EXPORT void StartTransform (const Standard_Integer theX, const Standard_Integer theY, const Handle(V3d_View)& theView);
12
将输入变换应用于拥有对象。
@remark 变换是使用 SetLocalTransformation 为拥有对象设置的。
操作器的位置也存储在本地变换中,因此无需重新显示对象。
它在链中与 StartTransform-Transform(gp_Trsf)-StopTransform 一起使用,
仅用于自定义变换集。
如果未初始化变换(通过 StartTransform() 调用),则不执行任何操作。
Standard_EXPORT void Transform (const gp_Trsf& aTrsf);
12
重置起始(参考)变换。
theToApply [in] 选择是否应用或取消已开始的变换。
它在链中与 StartTransform-Transform(gp_Trsf)-StopTransform 一起使用,
仅用于自定义变换集。
Standard_EXPORT void StopTransform (const Standard_Boolean theToApply = Standard_True);
13
应用从鼠标起始位置(在第一次 Transform() 调用时保存并在 DeactivateCurrentMode() 调用时重置)
14
到输入/输出鼠标位置(theX,theY)的变换。
Standard_EXPORT gp_Trsf Transform (const Standard_Integer theX, const Standard_Integer theY,
const Handle(V3d_View)& theView);
15
根据活动模式和输入运动矢量计算父对象的变换。
您可以使用此方法根据当前模式获取对象变换,或使用自己的算法为模式实现任何其他变换。
@return 父对象的变换。
Standard_EXPORT Standard_Boolean ObjectTransformation (const Standard_Integer theX, const Standard_Integer theY,
const Handle(V3d_View)& theView, gp_Trsf& theTrsf);
16
使当前选择的操作器部分变为非活动状态并重置当前轴索引和当前模式。
在调用后 HasActiveMode() 返回 false。
@sa HasActiveMode()
Standard_EXPORT void DeactivateCurrentMode();
17
从拥有对象中分离,并从上下文中移除自身。
Standard_EXPORT void Detach();
18
@return 所有拥有对象。
Standard_EXPORT Handle(AIS_ManipulatorObjectSequence) Objects() const;
19
@return 第一个(主导)拥有对象。
Standard_EXPORT Handle(AIS_InteractiveObject) Object() const;
20
@return 一个拥有对象。
21
@warning 如果 theIndex 大于拥有对象计数或小于 1,则引发程序错误。
Standard_EXPORT Handle(AIS_InteractiveObject) Object (const Standard_Integer theIndex) const;
22
@return 如果操作器附加到某个交互对象(有拥有对象),则返回 true。
Standard_Boolean IsAttached() const { return HasOwner(); }
23
@return 如果选择了操作器的某部分(变换模式处于活动状态,拥有对象可以变换),则返回 true。
Standard_Boolean HasActiveMode() const { return IsAttached() && myCurrentMode != AIS_MM_None; }
24
启用或禁用操作器的缩放持久模式。启用此模式后,演示将保持固定的屏幕大小。
启用此选项后,将覆盖变换持久性属性和局部变换以实现必要的视觉效果。
在启用缩放持久性时,修改 AttachToObjects 方法的 AdjustSize 参数的使用。
Standard_EXPORT void SetZoomPersistence (const Standard_Boolean theToEnable);
25
返回缩放持久模式的状态(启用或禁用)。
Standard_Boolean ZoomPersistence() const { return myIsZoomPersistentMode; }
26
返回缩放持久模式的状态(是否启用)。
Standard_Boolean ZoomPersistence() const { return myIsZoomPersistentMode; }
27
重新定义变换持久性管理以设置轴子演示的变换。
使用 ZoomPersistence 模式时,此交互对象不支持自定义变换持久性。在此模式下,此类会覆盖演示的变换持久性标志。
调试模式下,调用调试断言以捕获与 ZoomPersistence 模式的不兼容使用,在发布模式下默默无闻地不执行任何操作。
28
在启用缩放持久性时,重新考虑使用 AttachToObjects 方法中的 AdjustSize 参数。
Standard_EXPORT virtual void SetTransformPersistence (const Handle(Graphic3d_TransformPers)& theTrsfPers) Standard_OVERRIDE;
29
返回当前操作模式。
AIS_ManipulatorMode ActiveMode() const { return myCurrentMode; }
30
返回当前活动轴的索引。
Standard_Integer ActiveAxisIndex() const { return myCurrentIndex; }
31
返回操控器交互对象的位置。
const gp_Ax2& Position() const { return myPosition; }
32
设置操控器对象的位置。
Standard_EXPORT void SetPosition (const gp_Ax2& thePosition);
33
返回操控器的尺寸。
Standard_ShortReal Size() const { return myAxes[0].Size(); }
34
设置操控器立方体边界框的边长。
Standard_EXPORT void SetSize (const Standard_ShortReal theSideLength);
35
设置平移器、缩放器和旋转器子显示部分之间的间隔。
Standard_EXPORT void SetGap (const Standard_ShortReal theValue);
36
设置操控器执行变换动作的行为设置,无论它是否与被变换对象一起平移或旋转。
void SetTransformBehavior (const BehaviorOnTransform& theSettings) { myBehaviorOnTransform = theSettings; }
37
返回操控器变换动作的行为设置。
BehaviorOnTransform& ChangeTransformBehavior() { return myBehaviorOnTransform; }
38
返回操控器变换动作的行为设置。
const BehaviorOnTransform& TransformBehavior() const { return myBehaviorOnTransform; }
参考
相关文章:
opencascade AIS_Manipulator源码学习
前言 AIS_Manipulator 是 OpenCASCADE 库中的一个类,用于在3D空间中对其他交互对象或一组对象进行局部变换。该类提供了直观的操控方式,使用户可以通过鼠标进行平移、缩放和旋转等操作。 详细功能 交互对象类,通过鼠标操控另一个交互对象…...
Hadoop、Hive、HBase、数据集成、Scala阶段测试
姓名: 总分:Hadoop、Hive、HBase、数据集成、Scala阶段测试 一、选择题(共20道,每道0.5分) 1、下面哪个程序负责HDFS数据存储( C ) A. NameNode B. Jobtracher C. DataNode D. Sec…...
go语言day19 使用git上传包文件到github Gin框架入门
git分布式版本控制系统_git切换head指针-CSDN博客 获取请求参数并和struct结构体绑定_哔哩哔哩_bilibili (gin框架) GO: 引入GIn框架_go 引入 gin-CSDN博客 使用git上传包文件 1)创建一个github账户,进入Repositories个人仓…...
Ubuntu升级软件或系统
Ubuntu升级软件或系统 升级Ubuntu系统通常是一个相对简单的过程,但在进行操作之前,请务必备份重要数据以防万一。下面是升级Ubuntu系统的一般步骤: 使用软件更新工具升级系统 打开终端: 按下 Ctrl Alt T 组合键打开终端。 更…...
【Redis】Centos7 安装 redis(详细教程)
查看当前 Redis 版本: 当前的 redis 版本太老了,选择安装 Redis5。 一、使用 yum 安装 1、首先安装 scl 源 yum install centos-release-scl-rh 由于我之前已经安装过了,所以加载速度比较快,且显示已经安装成功,是最…...
Hakuin:一款自动化SQL盲注(BSQLI)安全检测工具
关于Hakuin Hakuin是一款功能强大的SQL盲注漏洞安全检测工具,该工具专门针对BSQLi设计,可以帮助广大研究人员优化BSQLi测试用例,并以自动化的形式完成针对目标Web应用程序的漏洞扫描与检测任务。 该工具允许用户以轻松高效的形式对目标Web应…...
在 Postman 中设置全局 token
目录 问题描述解决方案 问题描述 在使用 Postman 进行接口测试时,经常会遇到在 Header 中添加 token 的情况。当接口数量较多时,需要为每个接口进行设置,而且当 token 失效时需要重新获取并设置,这样一来效率较低。 解决方案 下…...
Linux C编程:打造一个插件系统
title: ‘Linux C编程:打造一个插件系统’ date: 2017-03-07 21:16:36 tags: linux C layout: post comments: true 运行环境:linux 使用语言:c 或者c 插件,很多人用过,比如游戏插件,编辑器插件这些, 最著…...
基于毫米波生物感知雷达+STM32设计的独居老人居家监护系统(微信小程序)(192)
基于毫米波生物感知雷达设计的独居老人居家监护系统(微信小程序)(192) 文章目录 一、前言1.1 项目介绍【1】项目功能介绍【2】项目硬件模块组成1.2 设计思路【1】整体设计思路【2】60G毫米波生物感知雷达原理【3】ESP8266模块配置【4】供电方式1.3 项目开发背景【1】选题的意义…...
C++——类和对象(下)
目录 一、再探构造函数 1.基本定义以及用法 2.必须在初始化列表初始化的成员变量 3.成员变量声明位置的缺省值(C11) 4.成员变量初始化顺序 二、隐式类型转换 三、static成员 四、友元 五、内部类 六、匿名对象 七、日期类实现 一、再探构造函数…...
Android中集成前端页面探索(Capacitor 或 Cordova 插件)待完善......
探索目标:Android中集成前端页面 之前使用的webview加载html页面,使用bridge的方式进行原生安卓和html页面的通信的方式,探索capacitor-android插件是如何操作的 capacitor-android用途 Capacitor 是一个用于构建现代跨平台应用程序的开源框…...
玩转CSS:用ul li +JS 模拟select,避坑浏览器不兼容。
玩转CSS:用ul li JS 模拟select,避坑浏览器不兼容。 在前端的工作中,经常会遇到 selcet控件,但我们用css来写它的样式时候,总是不那么令人满意,各种浏览器不兼容啊有没有? 那么,我…...
介绍下PolarDB
业务中用的是阿里云自研的PolarDB,分析下PolarDB的架构。 认识PolarDB 介绍 PolarDB是阿里云自研的,兼容MySQL、PostageSQL以及支持MPP的PolarDB-X的高可用、高扩展性的数据库。 架构 部署 云起实验室 - 阿里云开发者社区 - 阿里云 (aliyun.com) 数…...
基于微信小程序+SpringBoot+Vue的儿童预防接种预约系统(带1w+文档)
基于微信小程序SpringBootVue的儿童预防接种预约系统(带1w文档) 基于微信小程序SpringBootVue的儿童预防接种预约系统(带1w文档) 开发合适的儿童预防接种预约微信小程序,可以方便管理人员对儿童预防接种预约微信小程序的管理,提高信息管理工作效率及查询…...
go语言day15 goroutine
Golang-100-Days/Day16-20(Go语言基础进阶)/day17_Go语言并发Goroutine.md at master rubyhan1314/Golang-100-Days GitHub 第2讲-调度器的由来和分析_哔哩哔哩_bilibili 一个进程最多可以创建多少个线程?-CSDN博客 引入协程 go语言中内置了协程goroutine&#…...
Mindspore框架循环神经网络RNN模型实现情感分类|(六)模型加载和推理(情感分类模型资源下载)
Mindspore框架循环神经网络RNN模型实现情感分类 Mindspore框架循环神经网络RNN模型实现情感分类|(一)IMDB影评数据集准备 Mindspore框架循环神经网络RNN模型实现情感分类|(二)预训练词向量 Mindspore框架循环神经网络RNN模型实现…...
System类
System类常见方法 ① exit 退出当前程序 public static void main(String[] args) {System.out.println("ok1");//0表示状态,即正常退出System.exit(0);System.out.println("ok2");} ② arraycopy 复制数组元素 复制的数组元素个数必须<原数…...
【前端 02】新浪新闻项目-初步使用CSS来排版
在今天的博文中,我们将围绕“新浪新闻”项目,深入探讨HTML和CSS在网页制作中的基础应用。通过具体实例,我们将学习如何设置图片、标题、超链接以及文本排版,同时了解CSS的引入方式和选择器优先级,以及视频和音频标签的…...
HarmonyOS和OpenHarmony区别联系
前言 相信我们在刚开始接触鸿蒙开发的时候经常看到HarmonyOS和OpenHarmony频繁的出现在文章和文档之中,那么这两个名词分别是什么意思,他们之间又有什么联系呢?本文将通过现有的文章和网站内容并与Google的AOSP和Android做对比,带…...
llama模型,nano
目录 llama模型 Llama模型性能评测 nano模型是什么 Gemini Nano模型 参数量 MMLU、GPQA、HumanEval 1. MMLU(Massive Multi-task Language Understanding) 2. GPQA(Grade School Physics Question Answering) 3. HumanEval llama模型 Large Language Model AI Ll…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...
