FireFox中跟踪调试一般都是使用FireBug进行页面的调试,但是目前的FireBug还没办法跟踪分析WebSocket通信报文,这就需要其他插件来跟踪调试了。
现在比较方便的是使用WebSocket Monitor这个插件来跟踪,具体的操作步骤如下所示:





FireFox中跟踪调试一般都是使用FireBug进行页面的调试,但是目前的FireBug还没办法跟踪分析WebSocket通信报文,这就需要其他插件来跟踪调试了。
现在比较方便的是使用WebSocket Monitor这个插件来跟踪,具体的操作步骤如下所示:





1.如果已经安装了WireShark,并且使用的是WinPacp,那么需要先卸载WireShark。
2.WireShark的版本号必须是高于1.12.8和1.99.9,建议使用2.0.5以上的版本。下载地址为:https://www.wireshark.org/download/,注意:一定要使用这个链接,从首页点击进入的页面下载的时候,会错误的定位到一个不正常的CDN服务器上,导致下载速度极慢。也可以在本站下载:Wireshark-win64-2.0.5
3.下载并且安装最新的Npcap,下载链接地址https://github.com/nmap/npcap/releases,为了防止出现被墙的问题,也可以在本服务器下载:npcap-0.08-r4
安装的时候,需要勾选"Install Npcap in WinPcap API-compatible Mode",否则WireShark是没办法识别到Npcap是否已经安装。
4.WireShark启动之后选择"Npcap Loopback Adapter"进行抓包。如下图:

5.目前遇到的问题就是Npcap还不够稳定,有线情况下,基本都是正常的,但是在WiFi情况下的公司网络中,有时候会导致无法访问网络。此时的解决方法是在出口网卡属性中禁用(不需要在全部网卡中禁用,只需要在出口网卡中禁用即可)。

首先到http://www.firstobject.com/dn_markup.htm上面下载CMarkup类,将CMarkup.cpp和CMarkup.h导入到我们的工程中就可以了。编译可能会出现问题,解决的方法是在CMarkup.cpp的开头加上#include,或者关闭预编译也可以。
1.创建一个XML文档
对于创建一个XML文档,需要实例化一个CMarkup对象,并调用AddElem创建根元素。在这个位置,如果你调用AddElem("School"),文档会简单的装一个空元素. 然后调用AddChildElem在根元素的下面创建元素。
|
1 2 3 4 5 6 7 8 9 10 |
CMarkup xml; xml.SetDoc("\r\n"); xml.AddElem("School"); xml.IntoElem(); xml.AddElem("Department","Automation"); xml.AddElem("Department","Computer"); xml.AddElem("Department","Math"); xml.AddElem("Department","English"); xml.OutOfElem(); xml.Save("School.xml"); |
效果如下:
|
1 2 3 4 5 6 7 |
<?xml version="1.0" encoding="UTF-8"?> <School> <Department>Automation</Department> <Department>Computer</Department> <Department>Math</Department> <Department>English</Department> </School> |
2.浏览特定元素
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
CMarkup xml; xml.Load("School.xml"); BOOL bFind=TRUE; xml.ResetMainPos(); while(xml.FindChildElem("Department")) { CString strTagName=_T(""); CString strData=_T(""); strTagName=xml.GetChildTagName(); //此时节点是父节点 strData=xml.GetChildData(); TRACE("\n---tagName:%s,Data:%s--\n",strTagName,strData); } |
//***********************这样也可以*****************************/
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
CMarkup xml; xml.Load("School.xml"); BOOL bFind = TRUE; xml.ResetMainPos(); while (xml.FindChildElem("Department")) { xml.IntoElem(); CString strTagName = _T(""); CString strData = _T(""); strTagName = xml.GetTagName(); strData = xml.GetData(); TRACE("\n---tagName:%s,Data:%s--\n",strTagName,strData); xml.OutOfElem(); } |
//*********************或者这样也可以*************************/
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
CMarkup xml; xml.Load("School.xml"); BOOL bFind = TRUE; xml.ResetMainPos(); xml.FindElem(); //School xml.IntoElem(); while (xml.FindElem("Department")) { CString strTagName = _T(""); CString strData = _T(""); strTagName = xml.GetTagName(); strData = xml.GetData(); TRACE("\n---tagName:%s,Data:%s--\n",strTagName,strData); } |
//***********结果**************
|
1 2 3 4 5 6 7 |
---tagName:Department,Data:Automation-- ---tagName:Department,Data:Computer-- ---tagName:Department,Data:Math-- ---tagName:Department,Data:English-- |
3.修改元素
//把Department为"English"改为"Chinese"
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
CMarkup xml; BOOL bLoadXml=FALSE; bLoadXml=xml.Load("School.xml"); if(bLoadXml) { CString str=_T(""); xml.ResetMainPos(); xml.FindElem(); xml.IntoElem(); while(xml.FindElem("Department")) { str=xml.GetData(); if(str=="English") { xml.SetData("Chinese"); xml.Save("School.xml"); break; } } } |
效果如下:
|
1 2 3 4 5 6 7 |
<?xml version="1.0" encoding="UTF-8"?> <School> <Department>Automation</Department> <Department>Computer</Department> <Department>Math</Department> <Department>Chinese</Department> </School> |
4.添加
4.1 添加在最后面(用AddElem)
|
1 2 3 4 5 6 7 8 9 10 11 12 |
CMarkup xml; BOOL bLoadXml=FALSE; bLoadXml=xml.Load("School.xml"); if(bLoadXml) { xml.ResetMainPos(); xml.FindElem(); xml.IntoElem(); xml.AddElem("Department","SiQinghua"); xml.OutOfElem(); xml.Save("School.xml"); } |
效果如下:
|
1 2 3 4 5 6 7 8 |
<?xml version="1.0" encoding="UTF-8"?> <School> <Department>Automation</Department> <Department>Computer</Department> <Department>Math</Department> <Department>Chinese</Department> <Department>SiQinghua</Department> </School> |
4.2 添加在最前面(用InsertElem)
|
1 2 3 4 5 6 7 8 9 10 11 12 |
CMarkup xml; BOOL bLoadXml=FALSE; bLoadXml=xml.Load("School.xml"); if(bLoadXml) { xml.ResetMainPos(); xml.FindElem(); xml.IntoElem(); xml.AddElem("Department","SiQinghua"); xml.OutOfElem(); xml.Save("School.xml"); } |
效果如下:
|
1 2 3 4 5 6 7 8 9 |
<?xml version="1.0" encoding="UTF-8"?> <School> <Department>NARI</Department> <Department>Automation</Department> <Department>Computer</Department> <Department>Math</Department> <Department>Chinese</Department> <Department>SiQinghua</Department> </School> |
5.删除
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
CMarkup xml; BOOL bLoadXml=FALSE; bLoadXml=xml.Load("School.xml"); if(bLoadXml) { BOOL bFind=TRUE; xml.ResetMainPos(); while(bFind) { bFind=xml.FindChildElem("Department"); if(bFind) { CString strData=_T(""); strData=xml.GetChildData(); //此时节点还是父节点 if("SiQinghua"==strData) { xml.RemoveChildElem(); xml.Save("School.xml"); break; } } } } |
效果如下:
|
1 2 3 4 5 6 7 8 |
<?xml version="1.0" encoding="UTF-8"?> <School> <Department>NARI</Department> <Department>Automation</Department> <Department>Computer</Department> <Department>Math</Department> <Department>Chinese</Department> </School> |
上面的例子都是不带属性的,下面举一个带有属性的例子。
1.生成XML文档
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
CMarkup xml; xml.SetDoc("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); xml.AddElem("UserInfo"); xml.IntoElem(); for(int i=0;i<10;i++) { CString strID=_T(""); CString strPwd=_T(""); srand(UINT(time(NULL)+i)); //产生一个随机数 int nLevel=rand()%256; strID.Format("UserID%02d",i); strPwd.Format("UserPwd%02d",i); xml.AddElem("User"); xml.AddAttrib("UserID",strID); xml.AddAttrib("UserPwd",strPwd); xml.AddAttrib("UserLevel",nLevel); } xml.OutOfElem(); xml.Save("UserInfo.xml"); |
效果如下:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?xml version="1.0" encoding="UTF-8"?> <UserInfo> <User UserID="UserID00" UserPwd="UserPwd00" UserLevel="85"/> <User UserID="UserID01" UserPwd="UserPwd01" UserLevel="88"/> <User UserID="UserID02" UserPwd="UserPwd02" UserLevel="92"/> <User UserID="UserID03" UserPwd="UserPwd03" UserLevel="95"/> <User UserID="UserID04" UserPwd="UserPwd04" UserLevel="98"/> <User UserID="UserID05" UserPwd="UserPwd05" UserLevel="101"/> <User UserID="UserID06" UserPwd="UserPwd06" UserLevel="105"/> <User UserID="UserID07" UserPwd="UserPwd07" UserLevel="108"/> <User UserID="UserID08" UserPwd="UserPwd08" UserLevel="111"/> <User UserID="UserID09" UserPwd="UserPwd09" UserLevel="115"/> </UserInfo> |
2.查找特定属性
|
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 |
CMarkup xml; BOOL bLoadXml=FALSE; BOOL bFind=FALSE; bLoadXml=xml.Load("UserInfo.xml"); if(bLoadXml) { CString strID; CString strPwd; xml.ResetMainPos(); xml.FindElem(); //UserInfo while(xml.FindChildElem("User")) { strID=xml.GetChildAttrib("UserID"); strPwd=xml.GetChildAttrib("UserPwd"); TRACE("\n---id:%s,pwd:%s---\n",strID,strPwd); if(strID=="UserID02" && strPwd=="UserPwd02") { bFind=TRUE; break; } } } if(bFind==TRUE) TRACE("\n---find---\n"); else TRACE("\n---not find---\n"); |
3.修改特定属性
|
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 |
CMarkup xml; BOOL bFind=FALSE; BOOL bLoadXml=FALSE; bLoadXml=xml.Load("UserInfo.xml"); if(bLoadXml) { CString strID; CString strPwd; xml.ResetMainPos(); xml.FindElem(); //UserInfo while(xml.FindChildElem("User")) { strID=xml.GetChildAttrib("UserID"); strPwd=xml.GetChildAttrib("UserPwd"); TRACE("\n--id:%s,pwd:%s--\n",strID,strPwd); if(strID=="UserID02" && strPwd=="UserPwd02") { bFind=TRUE; xml.SetChildAttrib("UserID",strID+CString("Modified")); xml.Save("UserInfo.xml"); break; } } } if(bFind==TRUE) TRACE("\n---find---\n"); else TRACE("\n---not find---\n"); |
效果如下:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?xml version="1.0" encoding="UTF-8"?> <UserInfo> <User UserID="UserID00" UserPwd="UserPwd00" UserLevel="85"/> <User UserID="UserID01" UserPwd="UserPwd01" UserLevel="88"/> <User UserID="UserID02Modified" UserPwd="UserPwd02" UserLevel="92"/> <User UserID="UserID03" UserPwd="UserPwd03" UserLevel="95"/> <User UserID="UserID04" UserPwd="UserPwd04" UserLevel="98"/> <User UserID="UserID05" UserPwd="UserPwd05" UserLevel="101"/> <User UserID="UserID06" UserPwd="UserPwd06" UserLevel="105"/> <User UserID="UserID07" UserPwd="UserPwd07" UserLevel="108"/> <User UserID="UserID08" UserPwd="UserPwd08" UserLevel="111"/> <User UserID="UserID09" UserPwd="UserPwd09" UserLevel="115"/> </UserInfo> |
恶意软件分析、渗透测试、计算机取证——GitHub托管着一系列引人注目的安全工具、足以应对各类规模下计算环境的实际需求。

GitHub上的十一款热门开源安全工具
作为开源开发领域的基石,“所有漏洞皆属浅表”已经成为一条著名的原则甚至是信条。作为广为人知的Linus定律,当讨论开源模式在安全方面的优势时,开放代码能够提高项目漏洞检测效率的理论也被IT专业人士们所普遍接受。
现在,随着GitHub等高人气代码共享站点的相继涌现,整个开源行业开始越来越多地帮助其它企业保护自己的代码与系统,并为其提供多种多样的安全工具与框架,旨在完成恶意软件分析、渗透测试、计算机取证以及其它同类任务。
以下十一个基本安全项目全部立足于GitHub。任何一位对安全代码及系统抱有兴趣的管理员都有必要对它们加以关注。

Metasploit框架
作为由开源社区及安全企业Rapid7一手推动的项目,Metasploit框架是一套专门用于渗透测试的漏洞开发与交付系统。它的作用类似于一套 漏洞库,能够帮助管理人员通过定位弱点实现应用程序的安全性评估,并在攻击者发现这些弱点之前采取补救措施。它能够被用于对Windows、Linux、 Mac、Android、iOS以及其它多种系统平台进行测试。
“Metasploit为安全研究人员提供了一种途径,能够以相对普遍的格式对安全漏洞加以表达,”Rapid7公司工程技术经理Tod Beardsley指出。“我们针对全部设备类型打造出数千种模块——包括普通计算机、手机、路由器、交换机、工业控制系统以及嵌入式设备。我几乎想不出 有哪种软件或者固件无法发挥Metasploit的出色实用性。”
项目链接:https://github.com/rapid7/metasploit-framework

Brakeman
Brakeman是一款专门面向Ruby on Rails应用程序的漏洞扫描工具,同时也针对程序中一部分数值向另一部分传递的流程执行数据流分析。用户无需安装整套应用程序堆栈即可使用该软件,Brakeman缔造者兼维护者Justin Collins解释道。
尽管速度表现还称不上无与伦比,但Brakeman在大型应用程序扫描方面只需数分钟、这样的成绩已经超越了“黑盒”扫描工具。虽然最近已经有针对 性地作出了修复,但用户在使用Brakeman时仍然需要留意误报状况。Brakeman应该被用于充当网站安全扫描工具。Collins目前还没有将其 拓展至其它平台的计划,不过他鼓励其他开发人员对项目代码作出改进。
项目链接:https://github.com/presidentbeef/brakeman

Cuckoo Sandbox
Cuckoo Sandbox是一款自动化动态恶意软件分析系统,专门用于检查孤立环境当中的可疑文件。
“这套解决方案的主要目的是在启动于Windows虚拟机环境下之后,自动执行并监控任何给定恶意软件的异常活动。当执行流程结束之 后,Cuckoo会进一步分析收集到的数据并生成一份综合性报告,用于解释恶意软件的具体破坏能力,”项目创始人Claudio Guarnieri表示。
Cuckoo所造成的数据包括本地功能与Windows API调用追踪、被创建及被删除的文件副本以及分析机内存转储数据。用户可以对该项目的处理与报告机制进行定制,从而将报告内容生成为不同格式,包括 JSON与HTML。Cuckoo Sandbox已经于2010年开始成为谷歌代码之夏中的项目之一。
项目链接:https://github.com/cuckoobox/cuckoo

Moloch
Moloch是一套可扩展式IPv4数据包捕捉、索引与数据库系统,能够作为简单的Web界面实现浏览、搜索与导出功能。它借助HTTPS与HTTP机制实现密码支持或者前端Apahce能力,而且无需取代原有IDS引擎。
该软件能够存储并检索标准PCAP格式下的所有网络流量,并能够被部署到多种系统之上、每秒流量处理能力也可扩展至数GB水平。项目组件包括捕捉、 执行单线程C语言应用程序、用户也可以在每台设备上运行多个捕捉进程;一套查看器,这实际是款Node.js应用程序、针对Web接口以及PCAP文件传 输;而Elasticsearch数据库技术则负责搜索类任务。
项目链接:https://github.com/aol/moloch

MozDef: Mozilla防御平台
这款Mozilla防御平台,也就是MozDef,旨在以自动化方式处理安全事件流程,从而为防御者带来与攻击者相对等的能力:一套实时集成化平台,能够实现监控、反应、协作并改进相关保护功能,该项目缔造者Jeff Bryner解释称。
MozDef对传统SEIM(即安全信息与事件管理)功能作出扩展,使其具备了协同事件响应、可视化以及易于集成至其它企业级系统的能 力,Bryner指出。它采用Elasticsearch、Meteor以及MongoDB收集大量不同类型的数据,并能够根据用户需求以任意方式加以保 存。“大家可以将MozDef视为一套立足于Elasticsearch之上的SIEM层,能够带来安全事件响应任务流程,”Bryner表示。该项目于 2013年在Mozilla公司内部开始进行概念验证。
项目链接:https://github.com/jeffbryner/MozDef

MIDAS
作为由Etsy与Facebook双方安全团队协作打造的产物,MIDAS是一套专门针对Mac设备的入侵检测分析系统框架(即Mac intrusion detection analysis systems,缩写为MIDASes)。这套模块框架提供辅助工具及示例模型,能够对OS X系统驻留机制中出现的修改活动进行检测。该项目基于《自制防御安全》与《攻击驱动防御》两份报告所阐述的相关概念。
“我们发布这套框架的共同目标在于促进这一领域的探讨热情,并为企业用户提供解决方案雏形、从而对OS X终端当中常见的漏洞利用与驻留模式加以检测,”Etsy与Facebook双方安全团队在一份说明文档中指出。MIDAS用户能够对模块的主机检查、验 证、分析以及其它针对性操作进行定义。
项目链接:https://github.com/etsy/MIDAS

Bro
Bro网络分析框架“与大多数人所熟知的入侵检测机制存在着本质区别,”Bro项目首席开发者兼加州伯克利大学国际计算机科学协会高级研究员Robin Sommer指出。
尽管入侵检测系统通常能够切实匹配当前存在的各类攻击模式,但Bro是一种真正的编程语言,这使其相较于那些典型系统更为强大,Sommer表示。它能够帮助用户立足于高语义层级执行任务规划。
Bro的目标在于搜寻攻击活动并提供其背景信息与使用模式。它能够将网络中的各设备整理为可视化图形、深入网络流量当中并检查网络数据包;它还提供一套更具通用性的流量分析平台。
项目链接:https://github.com/bro/bro

OS X Auditor
OS X Auditor是一款免费计算机取证工具,能够对运行系统之上或者需要分析的目标系统副本当中的伪迹进行解析与散列处理。包括内核扩展、系统与第三方代理 及后台程序、不适用的系统以及第三方启动项、用户下载文件外中已安装代理。用户的受隔离文件则可以提取自Safari历史记录、火狐浏览器 cookies、Chrome历史记录、社交与邮件账户以及受审计系统中的Wi-Fi访问点。
项目链接:https://github.com/jipegit/OSXAuditor

The Sleuth Kit
The Sleuth Kit是一套库与多种命令行工具集合,旨在调查磁盘镜像,包括各分卷与文件系统数据。该套件还提供一款插件框架,允许用户添加更多模块以分析文件内容并建立自动化系统。
作为针对微软及Unix系统的工具组合,Sleuth Kit允许调查人员从镜像当中识别并恢复出事件响应过程中或者自生系统内的各类证据。在Sleuth Kit及其它工具之上充当用户界面方案的是Autopsy,这是一套数字化取证平台。“Autopsy更侧重于面向用户,”Sleuth Kit与Autopsy缔造者Brian Carrier指出。“The Sleuth Kit更像是一整套能够为大家纳入自有工具的库,只不过用户无需对该训加以直接使用。”
项目链接:https://github.com/sleuthkit/sleuthkit

OSSEC
基于主机的入侵检测系统OSSEC能够实现日志分析、文件完整性检查、监控以及报警等功能,而且能够顺利与各种常见操作系统相对接,包括Linux、Mac OS X、Solaris、AIX以及Windows。
OSSEC旨在帮助企业用户满足合规性方面的各类要求,包括PCI与HIPAA,而且能够通过配置在其检测到未经授权的文件系统修改或者嵌入至软件 及定制应用日志文件的恶意活动时发出警报。一台中央管理服务器负责执行不同操作系统之间的策略管理任务。OSSEC项目由Trend Micro公司提供支持。
项目链接:https://github.com/ossec/ossec-hids

PassiveDNS
PassiveDNS能够以被动方式收集DNS记录,从而实现事故处理辅助、网络安全监控以及数字取证等功能。该软件能够通过配置读取pcap(即数据包捕捉)文件并将DNS数据输出为日志文件或者提取来自特定接口的数据流量。
这款工具能够作用于IPv4与IPv6流量、在TCP与UDP基础上实现流量解析并通过缓存内存内DNS数据副本的方式在限制记录数据量的同时避免给取证工作带来任何负面影响。
项目链接:https://github.com/gamelinux/passivedns
中文翻译:GitHub上的十一款热门开源安全工具
英文原文:http://www.infoworld.com/slideshow/163151/11-open-source-security-tools-catching-fire-github-249652
在使用了NVIDIA显卡的Windows上出现“UpdatusUser”用户,在"控制面板"->"系统和安全"->"管理工具"->"计算机管理"->"本地用户和组"->"用户"中可以看到这个用户,他的描述是"NVIDIA更新软件使用的账户"。具体的描述信息参考NVIDIA官网:
这个账号的存在有些莫名奇妙,一方面他安全性存疑,另外一方面,这个用户生成了一个“UpdatusUser”的文件夹,稍微时间长一些,几百兆的空间就被莫名奇妙的占据了。
删除这个文件夹的方式非常简单:
1.在"控制面板"->"程序"->"程序和功能"里面卸载一个名为"NVIDIA 更新程序"(英文系统的话为"NVIDIA Update",繁体中文系统"NVIDIA 更新程式")后面是版本号。卸载这个应用。
2.在"控制面板"->"系统和安全"->"管理工具"->"计算机管理"->"本地用户和组"->"用户"中,删除“UpdatusUser”用户。
3.重启电脑后,删除“UpdatusUser”用户目录。
另外更推荐的方法是通过 Tomcat 的配置文件完成,而不是修改代码,具体配置方法为:
在 conf/server.xml 配置文件中的 <Host> 配置项中添加如下配置:
|
1 |
<Valve className="org.apache.catalina.valves.ErrorReportValve" showReport="false" showServerInfo="false" /> |
配置项说明:
一般情况下,软件的漏洞信息和特定版本,特定操作系统是相关的,因此,软件的版本号以及操作系统类型对攻击者来说是很有价值的。
在默认情况下,Tomcat会在返回信息中把自身的版本号,操作系统类型都显示出来,如下图:

这样做会造成潜在的安全风险,导致不必要的攻击行为。
在Ubuntu 14.04系统上隐藏Tomcat-7.0.52的版本号与操作系统类型的方法如下:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ cd ~ $ mkdir catalina $ cd catalina $ cp /usr/share/tomcat7/lib/catalina.jar . $ unzip catalina.jar $ cd org/apache/catalina/util $ vim ServerInfo.properties |
可以看到里面的内容如下:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. server.info=Apache Tomcat/7.0.52 (Ubuntu) server.number=7.0.52.0 server.built=Jun 30 2016 01:59:37 |
直接注释掉里面的内容,如下:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # server.info=Apache Tomcat/7.0.52 (Ubuntu) # server.number=7.0.52.0 # server.built=Jun 30 2016 01:59:37 |
修改完成后,把修改完成的数据存储到catalina.jar中。
|
1 2 3 4 5 |
$ cd ~ $ cd catalina $ jar uvf catalina.jar org/apache/catalina/util/ServerInfo.properties |
把修改后的catalina.jar放回到Tomcat的目录下面:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$ cd ~ $ cd catalina $ sudo unlink /usr/share/tomcat7/lib/catalina.jar $ sudo mv /usr/share/java/catalina.jar /usr/share/java/catalina.jar.old $ sudo cp catalina.jar /usr/share/java/ $ sudo chmod +r /usr/share/java/catalina.jar $ cd /usr/share/tomcat7/lib $ sudo ln -s ../../java/catalina.jar catalina.jar |
重启Tomcat的服务
|
1 |
$ sudo service tomcat7 restart |
修改后的结果如下图所示,已经没有系统类型信息了,仅仅返回了一个404错误。

至于如何隐藏Apache的版本号,参考链接 Ubuntu 14.04隐藏Apache-2.4的版本号与操作系统类型
注意: Apache Archiva 2024-02 开始已经停止维护 建议使用 JFrog Artifactory 替代。
Apache Archiva是一套可扩展的Artifact Repository管理系统。它能够与Maven,Continuum和ANT等构建工具完美结合。Archiva提供的功能包括:远程Repository代理,基于角色的安全访问管理,Artifact分发、维护、查询,生成使用报告,提供基于Web的管理界面等。 本来是Sonatype Nexus更加方便的,但是可惜最新的版本不支持在Tomcat中使用了,因此只能转而使用Apache Archiva。
1.下载Apache Archiva
去Apache官方网站下载,下载其中的War包。如下图:
也可以在本站下载. 具体的命令如下:
|
1 2 3 4 5 |
$ wget https://www.mobibrw.com/wp-content/uploads/2016/07/apache-archiva-2.2.1.war_.zip $ unzip apache-archiva-2.2.1.war_.zip $ sudo mv apache-archiva-2.2.1.war /var/lib/tomcat7/webapps/archiva.war |
2.下载Apache Archiva依赖的Jar包
Apache Archiva需要依赖derby-10.10.1.1.jar(或更高版本)(org.apache.derby:derby:10.10.1.1), activation-1.1.jar(javax.activation:activation:1.1),mail-1.4.jar(javax.mail:mail:1.4.7).可以在MVN Repository官网下载。也可以在本站打包下载。 下载完成后,需要放到Tomcat的安装目录下面的lib目录下。 具体的命令如下:
|
1 2 3 4 5 6 7 8 9 |
$ wget https://www.mobibrw.com/wp-content/uploads/2016/07/ArchivaArchiveJars.zip $ unzip ArchivaArchiveJars.zip $ sudo mv activation-1.1.jar /usr/share/tomcat7/lib $ sudo mv derby-10.10.1.1.jar /usr/share/tomcat7/lib $ sudo mv mail-1.4.7.jar /usr/share/tomcat7/lib |
3.配置Apache Archiva
(1)停止Tomcat,后续的操作是先关闭Tomcat为前提的。
|
1 |
$ sudo service tomcat7 stop |
(2)把下载到的apache-archiva-2.2.1.war重命名成archiva.war然后放到Tomcat安装目录下的webapps目录下面。
|
1 2 3 4 5 |
$ wget https://www.mobibrw.com/wp-content/uploads/2016/07/apache-archiva-2.2.1.war_.zip $ unzip apache-archiva-2.2.1.war_.zip $ sudo mv apache-archiva-2.2.1.war /var/lib/tomcat7/webapps/archiva.war |
(3)在Tomcat的配置文件中增加两项appserver.home,appserver.base,两者都指向相同的目录即可,本例中,都指向了/data/Archiva这个目录。
|
1 2 3 |
$ mkdir /data/Archiva $ sudo vim /usr/share/tomcat7/bin/setenv.sh |
在脚本的第一行执行代码中增加如下内容:
|
1 |
export CATALINA_OPTS="-Dappserver.home=/data/Archiva -Dappserver.base=/data/Archiva" |
注意:不要直接修改catalina.sh这个文件,原因在于这个文件每次更新都可能会被替换掉,环境变量的设置都应该在setenv.sh中设置。
注意catalina.sh这个文件中的如下注释:
|
1 2 |
# Do not set the variables in this script. Instead put them into a script # setenv.sh in CATALINA_BASE/bin to keep your customizations separate. |
(4)由于Apache Archiva 2.2.1的BUG,他没有自动创建必须的目录,导致如果这个目录不存在会初始化失败。因此我们需要手动创建这些目录。
|
1 2 3 4 5 6 7 |
$ mkdir /data/Archiva/conf $ mkdir /data/Archiva/derby $ mkdir /data/Archiva/logs $ chown -R tomcat7:tomcat7 /data/Archiva/ |
(5)在Tomcat的配置目录下的Catalina\localhost目录下面创建一个名为archiva.xml的配置文件.
|
1 |
$ sudo vim /etc/tomcat7/Catalina/localhost/archiva.xml |
里面的内容如下:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?xml version="1.0" encoding="UTF-8"?> <Context path="/data/Archiva/derby" docBase="${catalina.base}/webapps/archiva.war"> <Resource name="jdbc/users" auth="Container" type="javax.sql.DataSource" username="sa" password="" driverClassName="org.apache.derby.jdbc.EmbeddedDriver" url="jdbc:derby:/data/Archiva/derby/db;create=true" /> <Resource name="mail/Session" auth="Container" type="javax.mail.Session" mail.smtp.host="localhost"/> </Context> |
注意其中的Context path为数据库相关配置文件所在的路径,包含配置,数据库等等很多文件,url为数据库的具体存储目录,仅仅包含数据库数据。 注意:Ubuntu系统下面CATALINA_HOME指向/usr/share/tomcat7,而CATALINA_BASE指向/var/lib/tomcat7
(6)启动或者重启Tomcat,等待几分钟之后,即可成功配置完成。
|
1 |
$ sudo service tomcat7 start |
如下图:
注意,如果在最后一步发生失败,那么我们需要删除/data/Archiva这个目录,以及Tomcat安装目录下面的webapps\archiva这两个目录,原因是在配置过程中修改了部分文件,如果不删除这几个文件,会导致各种异常。
注意,上图中的"Create Admin User"按钮,当创建用户的时候,貌似用户名是可以不用"admin"的,但是,实际上,管理员的用户名是不变的,不管你输入什么,最后登陆的时候填写的用户名,永远必须是"admin",否则会一直提示用户名或密码不正确。
注意,如果使用Apache Httpd(Apache 2.x)作为前端代理Tomcat的情况下部署Apache Archiva,并且使用AJP(Apache JServ Protocol)的方式进行通信,那么在配置Apache Httpd(Apache 2.x)的配置文件的时候,里面写入的名字必须严格跟Tomcat中部署的名字一致,比如,如果Tomcat配置的时候是archiva,那么在Apache Httpd(Apache 2.x)的配置文件中,也必须使用archiva,不能像其他简单项目一样进行命名重定向。如下:
|
1 |
$ sudo vim /etc/apache2/sites-available/000-default.conf |
里面增加的AJP代理信息如下:
|
1 2 3 4 5 6 |
#for Apache Archiva #此处的名字不可改变,对于Apache Archiva,由于他会进行304重定向,因此 #如果这里的名字跟Tomcat中部署的如果不同名,那么会出现登陆后无法进入控制 #页面的问题 ProxyPass /archiva/ ajp://127.0.0.1:8009/archiva/ ProxyPassReverse /archiva/ ajp://127.0.0.1:8009/archiva/ |
更详细的配置说明,参考 Ubuntu 13.10 Apache 2.2 通过 AJP 整合 Tomcat 7
在客户机上找到.m2所在的目录,找到settings.xml这个配置文件,如果不存在,则手工创建,里面的默认内容如下:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> <localRepository/> <interactiveMode/> <usePluginRegistry/> <offline/> <pluginGroups/> <servers/> <mirrors/> <proxies/> <profiles/> <activeProfiles/> </settings> |
在其中的mirrors中间增加如下内容:
|
1 2 3 4 5 6 |
<mirror> <id>internal</id> <name>Archiva Managed Internal Repository</name> <url>http://www.mobibrw.com/archiva/repository/internal</url> <mirrorOf>*</mirrorOf> </mirror> |
修改后的内容变成如下样子:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> <localRepository/> <interactiveMode/> <usePluginRegistry/> <offline/> <pluginGroups/> <servers/> <mirrors> <mirror> <id>internal</id> <name>Archiva Managed Internal Repository</name> <url>http://www.mobibrw.com/archiva/repository/internal</url> <mirrorOf>*</mirrorOf> </mirror> </mirrors> <proxies/> <profiles/> <activeProfiles/> </settings> |
目前使用的时候,发现,在Apache Archiva刚刚配置完成后,是没办法进行访问的,这个时候一切都返回404,等服务器启动几个小时之后,从中央服务器同步完成数据了,就可以进行访问了,这个问题纠结了好久,最后发现只要等待就可以了,不知道是不是一个通病。
另外就是,在Apache Archiva的搜索页面中使用Search,如果是第一次使用,会发现搜索任何包都提示找不到,原因是因为在设计的时候,只搜索本地已经下载过的包,而在中央仓库中的包是不搜索的,因此会一直提示找不到任何包,只要有任何的客户端调用过,那么就可以在搜索页中找到了,这个问题不必纠结。
注意: Apache Archiva 2024-02 开始已经停止维护 建议使用 JFrog Artifactory 替代。
Apache Archiva是一套可扩展的Artifact Repository管理系统。它能够与Maven,Continuum和ANT等构建工具完美结合。Archiva提供的功能包括:远程Repository代理,基于角色的安全访问管理,Artifact分发、维护、查询,生成使用报告,提供基于Web的管理界面等。
本来是Sonatype Nexus更加方便的,但是可惜最新的版本不支持在Tomcat中使用了,因此只能转而使用Apache Archiva。
Apache Archiva去Apache官方网站下载,下载其中的War包。如下图:

也可以在本站下载.
Apache Archiva依赖的Jar包Apache Archiva需要依赖derby-10.10.1.1.jar(或更高版本)(org.apache.derby:derby:10.10.1.1), activation-1.1.jar(javax.activation:activation:1.1),mail-1.4.jar(javax.mail:mail:1.4.7).可以在Mvn Repository官网下载。也可以在本站打包下载。
下载完成后,需要放到Tomcat的安装目录下面的lib目录下。
Apache Archiva(1)停止Tomcat,后续的操作是先关闭Tomcat为前提的。
(2)把下载到的apache-archiva-2.2.1.war重命名成archiva.war然后放到Tomcat安装目录下的webapps目录下面。
(3)在开始菜单中找到Tomcat的配置项Configure Tomcat,然后增加两项appserver.home,appserver.base,两者都指向相同的目录即可,本例中,都指向了D:\Archiva这个目录。具体如下图:

(4)由于Apache Archiva 2.2.1的BUG,他没有自动创建一个名为conf的目录,导致如果这个目录不存在会初始化失败。因此我们需要手动创建D:\Archiva\conf这个目录。
(5)在Tomcat的安装目录下的conf\Catalina\localhost目录下面创建一个名为archiva.xml的配置文件,里面的内容如下:
|
1 2 3 4 5 6 7 8 9 10 11 12 |
<Context path="d:/archiva/derby" docBase="${catalina.home}/webapps/archiva.war"> <Resource name="jdbc/users" auth="Container" type="javax.sql.DataSource" username="sa" password="" driverClassName="org.apache.derby.jdbc.EmbeddedDriver" url="jdbc:derby:d:/archiva/derby/db;create=true" /> <Resource name="mail/Session" auth="Container" type="javax.mail.Session" mail.smtp.host="localhost"/> </Context> |
注意其中的Context path为数据库相关配置文件所在的路径,包含配置,数据库等等很多文件,url为数据库的具体存储目录,仅仅包含数据库数据。
(6)启动或者重启Tomcat,等待几分钟之后,即可成功配置完成。如下图:

注意,如果在最后一步发生失败,那么我们需要删除D:\Archiva这个目录,以及Tomcat安装目录下面的webapps\archiva这两个目录,原因是在配置过程中修改了部分文件,如果不删除这几个文件,会导致各种异常。
注意上图中的"Create Admin User"按钮,当创建用户的时候,貌似用户名是可以不用"admin"的,但是,实际上,管理员的用户名是不变的,不管你输入什么,最后登陆的时候填写的用户名,永远必须是"admin",否则会一直提示用户名或密码不正确。
1.如下图,第一步很简单的,File->New->Project

2.如下图,完成第一步后,会弹出这样一个窗体,然后在左边栏目找到Gradle,然后在右边勾选Java和Web两个选项,最后点击Next。

3.如下图,到了输入GroupId和AcrtifactId窗口了,对于这两个名字的解释
然后点击Next。

4. 如下图,这个页面,刚进来默认选择的是Use default gradle wrapper(recommended), 我不选择这个是因为我本地有装Gradle,所有不需要是用它默认的,如果选择它,那么创建项目之后,它就会去自动下载Gradle,然后配置好,下载过 程一般都很慢,至少我在我电脑上很慢。所有我选择的是Use local gradle distribution,。然后上面还有一个勾选,就是自动创建空的根目录文件夹,如果不选择,创建完的项目会没有Java文件夹,所以勾选,让它自动创建吧,继续点击Next。

5. 如下图,它默认的就是ArtifactId的名字,项目的唯一标识嘛,然后module name,如果不清楚应该填什么,可以按照默认的无所谓,点击Finish,创建就这样完成了。

6.创建完成之后,如果你之前没有配置Tomcat的话,是没办法运行的,所以也需要配置Tomcat,如下图, 左侧是成功创建的项目文件目录,如果之前没有勾选Create directories for empty content roots automatically, 那么就不会生成java和resource这个两个孔文件夹。这不的重点是点击Edit configuration。

6. 弹出如下图配置框,点击左上角加号,往下滚动找到Tomcat Server->Local,点击Local.

7. 如下图,弹出配置框,默认是配置Server属性,输入这个配置的名字,name,可以取任意的名字,点击Configure选择本地Tomcat的路径,都配置好了直接点击OK就可以运行了。

8.如下图,然后选择Server旁边的Deployment, 页面之后,点击加号,在弹出的页面选择名字更长的那个,也就是后面有(exploded)的那条,点击OK。

9.如下图,在右侧输入Application context的名字,这个对应就是等会儿运行时,默认路径(http://localhost:8080/demo/)中的demo, 所以如果你不配置这项,它的默认路径将会是(http://localhost:8080/)这样的。最后点击Apply, 再点击OK.

10.倒数第二步了,如下图,打开index.jsp页面,长方形圈出来的是系统默认生成的,不用管,可以删掉,然后圆圈的是我自己写的。我只是为了让你知道,jsp页面长啥样子的,免得你看到它,以为是生成错文件了,点击有上角的运行按钮。

11.最后一步,见证如下成果。

在Android系统中,当SD卡挂载在电脑上时候,如果手动将语音备忘录中的录音删除的时,那么相应数据库中的数据也是需要修改的。此时实现需要对挂载进行监听,需要继承BroadcastReceiver类,实现其中的onRecieve(Context context, Intent inten)方法。代码如下:
|
1 2 3 4 5 6 7 8 9 10 |
public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action.equals(Intent.ACTION_MEDIA_EJECT)) { System.out.println("-------------------> mount ACTION_MEDIA_EJECT"); } else if (action.equals(Intent.ACTION_MEDIA_MOUNTED)) { //TODO: System.out.println("-------------------> mount ACTION_MEDIA_MOUNTED"); } } |
此时须在Manifest中进行注册:
|
1 2 3 4 5 6 7 |
<receiver android:name=".ExternalStorageListener"> <intent-filter> <action android:name="android.intent.action.MEDIA_EJECT" /> <action android:name="android.intent.action.MEDIA_MOUNTED" /> <data android:scheme="file"/> </intent-filter> </receiver> |