首页 文章 精选 留言 我的

精选列表

搜索[教程],共9113篇文章
优秀的个人博客,低调大师

dvwa安装教程

概述 DVWA (Damn Vulnerable Web Application) 是用 PHP+MySQL 编写的一套用于漏洞检测和教学的程序,支持多种数据库,包括了 SQL 注入、XSS 等一些常见的安全漏洞。 总之dvwa就是一个我们练习xss和sql注入的一个环境 因为我不喜欢把这个东西安装在虚拟机和自己的笔记本上,如果安装在虚拟机上,那么每次都要打开这个虚拟机,还有我的笔记本是安装这个东西的地方吗?所以我就把它安装在树莓派上,安装方式有三种,第一种是docker,第二种就是传统的安装方式,第三种是使用iso镜像安装。先说传统的安装方式 下载dvwa 你可以在github和它的官方网站http://www.dvwa.co.uk/来下载,但是有趣的是这么一个著名的靶子,竟然在github上只有两次release,下载这种简单的事情就自己琢磨吧 设置环境 首先你要知道的是dvwa其实就是一个充满漏洞的网站,所以只要设置lnmp或者lamp环境就好了,具体怎么安装lnmp和lamp这个可以用一键安装脚本来解决,而我的树莓派一直有这个lnmp环境,所以我就不再详细描述怎么安装lnmp了 首先看一下我的lnmp版本 ~ mysql --version mysql Ver 14.14 Distrib 5.5.56, for Linux (armv7l) using readline 5.1 ~ php --version Failed loading /usr/local/zend/ZendGuardLoader.so: /usr/local/zend/ZendGuardLoader.so: cannot open shared object file: No such file or directory PHP 5.6.31 (cli) (built: Oct 1 2017 18:33:23) Copyright (c) 1997-2016 The PHP Group Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies ~ nginx -v nginx version: nginx/1.12.1 nginx是1.12.1,mysql是5.5.56,php是5.6.31 设置nginx 首先解压dvwaunzip DVWA-master.zip 然后把它放入站点文件夹下面mv DVWA-master /www/dvwa 之后配置nginx 下面是nginx的配置文件 server { server_name 192.168.1.100; listen 8888; location / { root /www/dvwa; index index.html index.php; } location ~ \.php$ { fastcgi_pass unix:/tmp/php-cgi.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /www/dvwa/$fastcgi_script_name; include fastcgi_params; } } 接着重启nginxsudo service nginx restart 重启之后访问报错DVWA System error - config file not found. Copy config/config.inc.php.dist to config/config.inc.php and configure to your environment. 那就按照上面说的做cd /www/dvwacp config/config.inc.php.dist config/config.inc.php 接着编辑这个配置文件vim config.inc.php <?php # If you are having problems connecting to the MySQL database and all of the variables below are correct # try changing the 'db_server' variable from localhost to 127.0.0.1. Fixes a problem due to sockets. # Thanks to @digininja for the fix. # Database management system to use $DBMS = 'MySQL'; #$DBMS = 'PGSQL'; // Currently disabled # Database variables # WARNING: The database specified under db_database WILL BE ENTIRELY DELETED during setup. # Please use a database dedicated to DVWA. # # If you are using MariaDB then you cannot use root, you must use create a dedicated DVWA user. # See README.md for more information on this. $_DVWA = array(); $_DVWA[ 'db_server' ] = '127.0.0.1'; $_DVWA[ 'db_database' ] = 'dvwa'; $_DVWA[ 'db_user' ] = 'root'; $_DVWA[ 'db_password' ] = 'p@ssw0rd'; # Only used with PostgreSQL/PGSQL database selection. $_DVWA[ 'db_port '] = '5432'; # ReCAPTCHA settings # Used for the 'Insecure CAPTCHA' module # You'll need to generate your own keys at: https://www.google.com/recaptcha/admin/create $_DVWA[ 'recaptcha_public_key' ] = ''; $_DVWA[ 'recaptcha_private_key' ] = ''; # Default security level # Default value for the secuirty level with each session. # The default is 'impossible'. You may wish to set this to either 'low', 'medium', 'high' or impossible'. $_DVWA[ 'default_security_level' ] = 'impossible'; # Default PHPIDS status # PHPIDS status with each session. # The default is 'disabled'. You can set this to be either 'enabled' or 'disabled'. $_DVWA[ 'default_phpids_level' ] = 'disabled'; # Verbose PHPIDS messages # Enabling this will show why the WAF blocked the request on the blocked request. # The default is 'disabled'. You can set this to be either 'true' or 'false'. $_DVWA[ 'default_phpids_verbose' ] = 'false'; ?> 为了清楚我还是解释一下这个配置文件吧 首先$DBMS = 'MySQL'; 上面这一行是说你是用什么数据库的dvwa不仅支持mysql而且还支持PGSQL也就是PostgreSQL $_DVWA = array(); $_DVWA[ 'db_server' ] = '127.0.0.1'; $_DVWA[ 'db_database' ] = 'dvwa'; $_DVWA[ 'db_user' ] = 'root'; $_DVWA[ 'db_password' ] = 'p@ssw0rd'; 上面是对数据库的配置,比如数据库的地址名字密码用户$_DVWA[ 'db_port '] = '5432'; 配置数据库端口,如果你不知道你的数据库是什么端口的,首先登录你的数据库 输入show global variables like 'port'; 就好了 按照你的配置完成之后,下面我们来设置数据库 配置数据库 首先创建dvwa的数据库,我就使用dvwa默认的名字dvwa来创建数据库 config mysql -uroot -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 213 Server version: 5.5.56-log Source distribution Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> create database dvwa; Query OK, 1 row affected (0.04 sec) mysql> 接着数据库一般没什么可以配置了,使用浏览器访问dvwa试试 配置php和一些目录权限 很明显dvwa提示我们上面还有几个地方需要配置,首先是php要PHP function allow_url_include 打开php.ini 用vim搜索allow_url_include ; Whether to allow include/require to open URLs (like http:// or ftp://) as files. ; http://php.net/allow-url-include allow_url_include = Off 重启php-fpmsudo service php-fpm restart 设置为On就好了,然后刷新页面就好了 之后我们设置 reCAPTCHA key:,有人会问这个是什么,其实就是谷歌的验证码服务 我们要去申请一个key然后填在刚才的dvwa的配置文件config.inc.php里就好了 打开https://www.google.com/recaptcha/admin#list 之后一步一步申请把,如果不能访问,那么你可以联系我,或者只能mmp了,其实不设置也可以,就是dvwa少一个验证码的功能 接着解决下面两个权限问题 [User: root] Writable folder /www/dvwa/hackable/uploads/: No [User: root] Writable file /www/dvwa/external/phpids/0.6/lib/IDS/tmp/phpids_log.txt: No 设置可写权限chmod 763 hackable/uploadschmod 666 external/phpids/0.6/lib/IDS/tmp/phpids_log.txt 如果确定上面全是一片绿了之后,点击下面的create/reset database 默认的账号和密码 账号:admin 密码:password 使用docker安装 上面是使用传统的方式安装,下面就使用docker来安装这个东西, 首先执行docker pull vulnerables/web-dvwa 接着运行docker run --rm -it -p 8889:80 vulnerables/web-dvwa 8889是主机的端口,80是容器的端口 但是要注意的是这个docker镜像只能在x86架构下运行,arm是不可以的,之后访问ip+端口就好了,所以用docker还是超级方便的 使用iso镜像安装 这个没什么好说的就是用虚拟机安装一个操作系统 欢迎关注Bboysoul的博客www.bboysoul.com Have Fun

优秀的个人博客,低调大师

Docker使用教程

Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。让开发者可以打包他们的应用到一个可移植的容器中,然后发布到任何Linux机器上,还可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。 1 Docker和虚拟机的区别 : 容器是一种轻量级的基于操作系统级别的虚拟技术,不像虚拟机具有完整的CPU、内存和磁盘,是基于硬件的虚拟化技术。容器和宿主机共享内核,所有容器共享操作系统。 容器启动快 开源免费 轻量级虚拟化能够部署100-1000个容器 2 重要概念: 1)组件: docker镜像(Images):镜像运行之后成为容器,包含了应用程序和其运行时依赖环境的只读文件。 docker仓库:Registry是Docker镜像的中央存储仓库 docker容器:容器是独立运行的一个或一组应用。可以看成是一个简易版的Linux运行环境(可以理解为在沙盒中运行的进程)。 3 安装 系统环境:CentOS 7.2 [zwj@localhost home]$ sudo yum -y install docker (CentOS6的安装:yum -y install docker-io) [zwj@localhost home]$ sudo systemctl start docker.service [zwj@localhost home]$ sudo systemctl status docker.service [zwj@localhost home]$ sudo systemctl enable docker.service [zwj@localhost system]$ docker -v Docker version 1.12.6, build 1398f24/1.12.6 4 基本操作 常用命令: 搜索某个镜像:docker search name 获取某个镜像:docker pull name 查看镜像:docker images 删除镜像:docker rminame 启动容器:docker start 容器ID 停止容器:docker stop 容器ID 查看容器:docker ps -a 进入容器:docker exec 或 docker attach、nsenter,如:docker exec -it 6f48b7e16fe8 /bin/bash,建议使用nsenter命令进入 删除容器:docker rm 容器ID(需要先停止容器) 创建容器,退出时自动删除容器:docker run --rm centos /bin/echo "hehe" 4.1 镜像和容器 下载镜像: [zwj@localhost system]$ sudodocker pullcentos 查看本地镜像: [zwj@localhost ~]$ sudodocker images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/centos latest 3bee3060bfc8 12 days ago 192.5 MB 使用centos镜像创建一个容器,并在容器中执行命令(如果本地没有镜像,会从公共仓库去下载): [zwj@localhost ~]$ sudodocker runcentos /bin/echo "hehe" hehe 查看当前所有容器,每个容器有唯一的ID和名称: [zwj@localhost ~]$ sudodocker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ba7ecb84d0e1 centos "/bin/echo hehe" 5 minutes ago Exited (0) 5 minutes ago silly_carson 创建一个name叫mydocker的容器,并且登陆到容器:参数-t:表示为容器分配一个伪终端,-i:启动一个容器并进入交互模式,-d:后台运行 [zwj@localhost ~]$ sudodocker run--name mydocker -t -i centos /bin/bash [root@6f48b7e16fe8 /]# 退出容器后,容器处于退出状态 [root@6f48b7e16fe8 ~]# exit exit [zwj@localhost ~]$ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6f48b7e16fe8 centos "/bin/bash" 10 minutes ago Exited (0) About a minute ago mydocker ba7ecb84d0e1 centos "/bin/echo hehe" 24 minutes ago Exited (0) 23 minutes ago silly_carson 有什么办法在退出之后容器依然处于启动状态呢,步骤如下: [zwj@localhost ~]$ sudo yum -y installutil-linux [zwj@localhost ~]$ sudodocker start6f48b7e16fe8#启动容器 6f48b7e16fe8 [zwj@localhost ~]$ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6f48b7e16fe8 centos "/bin/bash" About an hour ago Up About a minute mydocker ba7ecb84d0e1 centos "/bin/echo hehe" About an hour ago Exited (0) About an hour ago silly_carson [zwj@localhost ~]$ sudodocker inspect --format"``.`State`.`Pid`" 6f48b7e16fe8 #获取容器PID 3820 [zwj@localhost ~]$ sudonsenter -t 3820 -u -i -n -p#进入容器 [root@6f48b7e16fe8 zwj]# [root@6f48b7e16fe8 zwj]# exit#退出后,容器依然处于启动状态 logout [zwj@localhost ~]$ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6f48b7e16fe8 centos "/bin/bash" About an hour ago Up 16 minutes mydocker ba7ecb84d0e1 centos "/bin/echo hehe" About an hour ago Exited (0) About an hour ago silly_carson 4.2 网络和存储 创建并运行nginx容器,创建成功后会返回容器ID号,但是查看时通常是显示前几位而不是整个ID号。-d:后台运行,-P:默认匹配docker容器端口到宿主机随机端口。 [zwj@localhost system]$ sudo docker run -d -P nginx 06b751db90b24ca8750c6d25f0b424e72dba36d9261d0d09817c435ada5c0e68 由下面的输出可以看到,把本机的32768端口映射到了容器的80号端口。 [zwj@localhost system]$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 06b751db90b2 nginx "nginx -g 'daemon off" 7 minutes ago Up 7 minutes 0.0.0.0:32768->80/tcp distracted_ride 6f48b7e16fe8 centos "/bin/bash" 2 hours ago Up About an hour mydocker 从客户端访问结果如下: 查看容器日志: [zwj@localhost system]$ sudodocker logs06b751db90b2 查看日志的实时输出: [zwj@localhost system]$ sudodocker logs -f06b751db90b2 也可以指定特定端口映射,注意docker run会另外创建一个容器 [zwj@localhost system]$ sudodocker run -d -p 88:80nginx f54ba5b475a04371ba84a2b193ff691d7545461e5f6d85309967fa0e86ca2b45 [zwj@localhost system]$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f54ba5b475a0 nginx "nginx -g 'daemon off" 11 seconds ago Up 6 seconds 0.0.0.0:88->80/tcp reverent_liskov 06b751db90b2 nginx "nginx -g 'daemon off" 26 minutes ago Up 26 minutes 0.0.0.0:32768->80/tcp distracted_ride 6f48b7e16fe8 centos "/bin/bash" 2 hours ago Up About an hour mydocker 存储之数据卷: 使用-v参数创建数据卷并且挂载到容器,-v /data [zwj@localhost system]$ sudo docker run -it --name volume-test1-v /datacentos [root@834a476135d3 /]# ls -l /data total 0 使用-v参数挂载本地目录至容器,-v src:dst [zwj@localhost ~]$ sudo docker run -it --name test-v /opt:/optcentos 挂载并授予读写的权限, [zwj@localhost ~]$ sudo docker run -it --name test-v /opt:/opt:rwcentos 除了目录,还可以挂载文件。 存储之数据卷容器--volumes-from:通常适应于一个容器访问另一个容器, 创建一个容器取名nfs [zwj@localhost ~]$ sudo docker run -d --name nfs -v /data centos d65376b3a601dc338ad93cf2ab3ec163218e595cd36e4a4353f82e08b38b2670 创建另一个容器test01,并且把nfs挂载到test01,可以看到test01根目录下有/data目录 [zwj@localhost ~]$ sudo docker run -it --name test01--volumes-fromnfs centos [root@d38127cd879b /]# ls anaconda-post.log bin data dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var 4.3 手动构建镜像 下载基础镜像 [zwj@localhost system]$ sudodocker pullcentos 创建容器,并且进入容器 [zwj@localhost ~]$ sudo docker run --name mynginx -it centos 在容器中安装epel源 [root@1418e12567d5 /]# rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm 在容器中安装nginx [root@1418e12567d5 /]# yum -y install nginx 然后创建新的镜像, [zwj@localhost ~]$ sudodocker commit-m "my nginx" -a "zwj" 1418e12567d5 aa/a01:1.1 参数说明: -m:提交的描述信息 -a:指定镜像作者 1418e12567d5:容器ID aa/a01:指定要创建的镜像名 查看镜像,aa/a01镜像已存在 [zwj@localhost ~]$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE aa/a01 1.1 797ed1764943 33 seconds ago 367.9 MB docker.io/centos latest 3bee3060bfc8 12 days ago 192.5 MB docker.io/nginx latest 958a7ae9e569 2 weeks ago 109.4 MB 基于aa/a01镜像创建新的容器nginx01 [zwj@localhost ~]$ sudo docker run -it --name nginx01 aa/a01:1.1 修改容器nginx01中nginx配置文件,使容器在后台运行时nginx能够运行 [root@bd27b093bf3e /]# vi /etc/nginx/nginx.conf daemon off; user nginx; 基于上次修改,再次提交创建新的镜像 [zwj@localhost ~]$ sudo docker commit -m "my nginx" -a "zwj" bd27b093bf3e aa/a01:1.2 [zwj@localhost ~]$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE aa/a01 1.2 42da08d9d427 2 minutes ago 367.9 MB aa/a01 1.1 797ed1764943 22 minutes ago 367.9 MB docker.io/centos latest 3bee3060bfc8 12 days ago 192.5 MB docker.io/nginx latest 958a7ae9e569 2 weeks ago 109.4 MB 基于新镜像创建容器,并且在容器中运行nginx命令 [zwj@localhost ~]$ sudo docker run -d -p 82:80 aa/a01:1.2 nginx [zwj@localhost ~]$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 999ce7bd6559 aa/a01:1.2 "nginx" About a minute ago Up About a minute 0.0.0.0:82->80/tcp prickly_meninsky 4.4 Docker-file构建镜像:由一系列参数和命令构成的脚本,最终创建成新的镜像。 [zwj@www ~]$ sudo mkdir -pv dockerfile/nginx mkdir: created directory ‘dockerfile’ mkdir: created directory ‘dockerfile/nginx’ [zwj@www ~]$ sudo tree dockerfile/ dockerfile/ └── nginx 1 directory, 0 files [zwj@www ~]$ cd dockerfile/nginx/ [zwj@www nginx]$ sudo vim index.html <h>Server 192.168.3.158</h> #建立Dockerfile文件,其中#号表示注释 [zwj@www nginx]$ sudo vim Dockerfile #This is Dockerfile #Version:1.1 #Author:zwj #Base image FROM centos #Author MAINTAINER zwj 2962372861@qq.com #Commands RUN rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm RUN yum install -y nginx ADD index.html /usr/share/nginx/html/index.html RUN echo "daemon off;" >> /etc/nginx/nginx.conf EXPOSE 80 CMD ["nginx"] #根据文件创建镜像,-t指定镜像名,后面是Dockerfile文件的绝对路径(目录的路径) [zwj@www nginx]$ sudo docker build -t test/nginx:1.0 /home/zwj/dockerfile/nginx/ #查看创建的镜像 [zwj@www nginx]$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE test/nginx 1.0 86dcc8884006 46 seconds ago 400.8 MB docker.io/centos latest 36540f359ca3 10 days ago 192.5 MB #现在可以使用创建的镜像建立容器 [zwj@www nginx]$ sudo docker run -d -p 808:80 --name nginx test/nginx:1.0 [zwj@www nginx]$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6bf9453e4b71 test/nginx:1.0 "nginx" 38 seconds ago Up 37 seconds 0.0.0.0:808->80/tcp nginx 附:Dockerfile文件的命令介绍: FROM:必须是Dockerfile的首个命令,用于定义镜像源 MAINTAINER:用于声明作者 ADD:从源文件系统复制文件到目标容器的文件系统 CMD:描述容器启动后,执行的程序 ENTRYPOINT:配置一个容器使之可执行化, ENV:用于设置环境变量,如:key=value EXPOSE:用来指定端口 RUN:是Dockerfile执行命令的核心部分,它接受命令作为参数并用于创建的镜像 USER:设置容器的UID VOLUME:用于让你的容器访问主机上的目录 WORKDIR:用于设置CMD指明的命令的运行目录 4.5 建立私有仓库 #下载registry镜像(用于建立私有仓库) [zwj@www nginx]$ sudo docker pull registry [zwj@www nginx]$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE test/nginx 1.0 86dcc8884006 39 minutes ago 400.8 MB docker.io/centos latest 36540f359ca3 10 days ago 192.5 MB docker.io/registry latest c2a449c9f834 2 weeks ago 33.18 MB #使用该镜像创建一个容器:默认情况下,会将仓库存放于容器内的/tmp/registry目录下 [zwj@www ~]$ sudo docker run -d -p 5000:5000 registry b6b84915dbd24426c6cfae5737555f4a9e3f3ef2145ed6317f347ff99c1e119e [zwj@www ~]$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b6b84915dbd2 registry "/entrypoint.sh /etc/" 18 minutes ago Up 18 minutes 0.0.0.0:5000->5000/tcp lonely_heisenberg #标记本地镜像: [zwj@www ~]$ sudo docker tag test/nginx:1.0 120.77.148.249:5000/zwj/nginx:1.1 #把镜像推送至仓库: [zwj@www ~]$ sudo docker push 120.77.148.249:5000/zwj/nginx:1.1 生产环境应用: 1)Docker Web管理工具:shipyard 2)规划 3)准备好基础镜像 本文转自 zengwj1949 51CTO博客,原文链接:http://blog.51cto.com/zengwj1949/1939456

优秀的个人博客,低调大师

Appium安装教程

一、适用操作系统 Win7 旗舰版Sp1 64位操作系统 或 32位操作系统 二、所需软件 jdk-7u45-windows-i586.exe node-v0.10.28-x86.msi (32位)下载地址:http://nodejs.org/download/ adt-bundle-windows-x86-20140321.zip SDK下载地址:http://developer.android.com/sdk/index.html apache-ant-1.9.4-bin.zip ( 非必装) http://ant.apache.org/bindownload.cgi apache-maven-3.1.1-bin.zip (非必装) http://maven.apache.org/download.cgi ActivePython-2.7.5.6-win32-x86.msi 三、安装步骤 1)安装JDK,并进行环境变量配置 JDK安装很简单,按默认安装即可。 环境变量配置: 添加JAVA_HOME变量, 值:Jdk的安装路径,如:D:\Java\jdk1.7.0_45 添加CLASSPATH变量,值 .;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar 修改path变量,加上这句 %JAVA_HOME%\bin; 检查 JAVA环境是否配置好,进入CMD命令行,输入java或javac,可以看到好多的命令提示,说明成功了。 2)安装Node.js,按默认安装即可,可以改变安装的路径。 安装完成以后,检查Node版本安装是否成功:进入CMD,输入node -v, 可以看到版本号,说明成功了。 3)安装ADT,配置环境变量 下载地址:http://developer.android.com/sdk/index.html?hl=sk 下载 adt-bundle-windows-x86-20140321.zip,直接解压即可。 配置环境变量,设置ANDROID_HOME 系统变量为你的 AndroidSDK 路径,并把tools和platform-tools两个目录加入到系统的 Path路径里。 变量名:ANDROID_HOME 值: D:\AutoTest\adt\sdk 设置Path值: %ANDROID_HOME%\tools;%ANDROID_HOME%\platform-tools 4)联网安装 Appium 进入cmd命令行,输入: npm install –g appium 或者 npm --registry http://registry.cnpmjs.org install -g appium (推荐这种,npm的国内镜像) 注:-g全局参数 多等几分钟,可以看到appium的版本1.1.0及安装目录 5)检查一下appium是否安装成功。 进入cmd命令行,输入appium 提示:socket.io started 说明安装好了。 6)检查appium所需的环境是否OK(这步很重要) 进入Cmd命令行,输入appium-doctor ,出现以下提示,All Checks were successful ,说明环境成功。 7)安装Apache Ant (这一步可省) 安装Apache Ant(http://ant.apache.org/bindownload.cgi)。解压缩文件夹,并把路径加入环境变量。 变量: ANT_HOME 值: D:\AutoTest\ant-1.9.4 设置Path: %ANT_HOME%\bin; 测试Ant是否安装成功,进入cmd命令行:输入ANT,如果没有指定build.xml就会输出:Buildfile: build.xml does notexist! Build failed 8)安装Apache Maven (这一步可省) 下载Maven(http://maven.apache.org/download.cgi),并解压缩文件夹,把路径加入环境变量。 变量M2_HOME 值:D:\AutoTest\maven-3.1.1 设置Path: %M2_HOME%\bin; 测试Maven是否成功,运行cmd,输入mvn -version如果成功,则出现maven版本等环境信息。 安装:python+webdriver环境 第一步:安装active-python,双击可执行文件,直接默认安装即可。 第二步:安装selenium webdriver 1. 打开cmd 2. 命令为:pip install selenium -i http://pypi.douban.com/simple (使用国内地址) 3. 打开python的shell或者IDEL界面 ,输入from selenium import webdriver 如果不报错那就说明你已经安装selenium for python成功了。 4. 安装appium-python-client:(这步很重要,必须) 进入cmd,输入:pip install Appium-Python-Client 以上全部安装好以后,最后就是执行实例来测试一下: 1. 打开Adt,创建一个模拟器,并启动android模拟器。 2. 在cmd启动appium 输入:appium 3. 另开一个cmd终端窗口。切换到实例代码路径下,执行android_contacts.py文件。 最新内容请见作者的GitHub页:http://qaseven.github.io/

优秀的个人博客,低调大师

StreamingPro使用教程

准备工作 下载Spark 1.6.2 下载StreamingPro 我们假设你下载的StreamingPro包在/tmp目录下。 复制如下模板 { "esToCsv": { "desc": "测试", "strategy": "streaming.core.strategy.SparkStreamingStrategy", "algorithm": [], "ref": [], "compositor": [ { "name": "streaming.core.compositor.spark.source.SQLSourceCompositor", "params": [ { "format": "org.elasticsearch.spark.sql", "path": "索引名称", "es.nodes": "这里是填写集群地址哈", "es.mapping.date.rich": "false" } ] }, { "name": "streaming.core.compositor.spark.transformation.JSONTableCompositor", "params": [ { "tableName": "table1" } ] }, { "name": "streaming.core.compositor.spark.transformation.SQLCompositor", "params": [ { "sql": "select * from table1" } ] }, { "name": "streaming.core.compositor.spark.output.SQLOutputCompositor", "params": [ { "format": "com.databricks.spark.csv", "path": "file:///tmp/csv-table1", "header": "true", "inferSchema": "true" } ] } ], "configParams": { } } } 假设该文件所在路径是 /tmp/esToCSV.json。 本机运行 cd $SPARK_HOME ./bin/spark-submit --class streaming.core.StreamingApp \ --master local[2] \ --name test \ /tmp/streamingpro-0.3.2-SNAPSHOT-online-1.6.1.jar \ -streaming.name test \ -streaming.platform spark \ -streaming.job.file.path file:// /tmp/esToCSV.json 在集群运行 cd $SPARK_HOME ./bin/spark-submit --class streaming.core.StreamingApp \ --master yarn-cluster\ --name test \ /tmp/streamingpro-0.3.2-SNAPSHOT-online-1.6.1.jar \ -streaming.name test \ -streaming.platform spark \ -streaming.job.file.path hdfs://clusternameAndPort/tmp/esToCSV.json

优秀的个人博客,低调大师

Kubernetes Nginx Ingress教程

【摘要】最近发现好多人问Ingress,同时一直也没去用Nginx的Ingress,索性捣鼓一把,发现跟原来确实有了点变化,在这里写篇文章记录一下 一、Ingress介绍 Kubernetes暴露服务的方式目前只有三种:LoadBalancer Service、NodePort Service、Ingress;前两种估计都应该很熟悉,具体的可以参考下这篇文章;下面想写介绍一下这个Ingre... 最近发现好多人问Ingress,同时一直也没去用Nginx的Ingress,索性捣鼓一把,发现跟原来确实有了点变化,在这里写篇文章记录一下 一、Ingress介绍 Kubernetes暴露服务的方式目前只有三种:LoadBalancer Service、NodePort Service、Ingress;前两种估计都应该很熟悉,具体的可以参考下这篇文章;下面想写介绍一下这个Ingress。 1.1 Ingress是个什么玩意 可能从大致印象上Ingress就是能利用Nginx、Haproxy啥的负载均衡器暴露集群内服务的工具;那么问题来了,集群内服务想要暴露出去面临着几个问题: 1.2、Pod漂移问题 众所周知Kubernetes具有强大的副本控制能力,能保证在任意副本(Pod)挂掉时自动从其他机器启动一个新的,还可以动态扩容等,总之一句话,这个Pod可能在任何时刻出现在任何节点上,也可能在任何时刻死在任何节点上;那么自然随着Pod的创建和销毁,Pod IP肯定会动态变化;那么如何把这个动态的Pod IP暴露出去?这里借助于Kubernetes的Service机制,Service可以以标签的形式选定一组带有指定标签的Pod,并监控和自动负载他们的Pod IP,那么我们向外暴露只暴露Service IP就行了;这就是NodePort模式:即在每个节点上开启一个端口,然后转发到内部Pod IP上,如下图所示: 1.3、端口管理问题 采用NodePort方式暴露服务面临着一个坑爹的问题是,服务一旦多起来,NodePort在每个节点上开启的端口会及其庞大,而且难以维护;这时候引出的思考问题是"能不能使用Nginx啥的只监听一个端口,比如80,然后按照域名向后转发?"这思路很好,简单的实现就是使用DaemonSet在每个node上监听80,然后写好规则,因为Nginx外面绑定了宿主机80端口(就像NodePort),本身又在集群内,那么向后直接转发到相应Service IP就行了,如下图所示: 1.4、域名分配及动态更新问题 从上面的思路,采用Nginx似乎已经解决了问题,但是其实这里面有一个很大缺陷:每次有新服务加入怎么改Nginx配置?总不能手动改或者来个Rolling Update前端Nginx Pod吧?这时候"伟大而又正直勇敢的"Ingress"登场,如果不算上面的Nginx,Ingress只有两大组件:Ingress Controller和Ingress Ingress这个玩意,简单的理解就是你原来要改Nginx配置,然后配置各种域名对应哪个Service,现在把这个动作抽象出来,变成一个Ingress对象,你可以用yml创建,每次不要去改Nginx了,直接改yml然后创建/更新就行了;那么问题来了“Nginx咋整?” Ingress Controller这东西就是解决"Nginx咋整"的;Ingress Controller通过与Kubernetes API交互,动态的去感知集群中Ingress规则变化,然后读取他,按照他自己模板生成一段Nginx配置,再写到Nginx Pod里,最后reload一下,工作流程如下图 当然在实际应用中,最新版本Kubernetes已经将Nginx与Ingress Controller合并为一个组件,所以Nginx无需单独部署,只需要部署Ingress Controller即可 二、怼一个Nginx Ingress 上面啰嗦了那么多,只是为了讲明白Ingress的各种理论概念,下面实际部署很简单 2.1、部署默认后端 我们知道前端的Nginx最终要负载到后端service上,那么如果访问不存在的域名咋整?官方给出的建议是部署一个默认后端,对于未知请求全部负载到这个默认后端上;这个后端啥也不干,就是返回404,部署如下: -> ~ kubectl create -f default-backend.yaml deployment "default-http-backend" created service "default-http-backend" created 这个default-backend.yaml文件可以在官方 Ingress 仓库找到,仓库位置如下: 2.2、部署Ingress Controller 部署完了后端就得把最重要的组件Nginx+Ingress Controller(官方统一称为Ingress Controller)部署上 -> ~ kubectl create -f nginx-ingress-controller.yaml daemonset "nginx-ingress-1b" created 注意:官方的 Ingress Controller 有个坑,至少我看了 DaemonSet 方式部署的有这个问题:没有绑定到宿主机 80 端口,也就是说前端 Nginx 没有监听宿主机 80 端口(这还玩个卵啊);所以需要把配置搞下来自己加一下hostNetwork,截图如下 同样配置文件自己找一下,地址点这里,仓库截图如下 当然它支持以 deamonset 的方式部署,这里用的就是(个人喜欢而已),所以你发现我上面截图是 deployment,但是链接给的却是 daemonset,因为我截图截错了….. 2.3、部署Ingress 这个可就厉害了,这个部署完就能装逼了 回到正题,从上面可以知道 Ingress 就是个规则,指定哪个域名转发到哪个 Service,所以说首先我们得有个 Service,当然 Service 去哪找这里就不管了;这里默认为已经有了两个可用的 Service,以下以 Dashboard 和 kibana 为例 先写一个 Ingress 文件,语法格式啥的请参考官方文档,由于我的 Dashboard 和 Kibana 都在 kube-system 这个命名空间,所以要指定 namespace,写之前 Service 分布如下 vim dashboard-kibana-ingress.yml apiVersion: extensions/v1beta1 kind: Ingress metadata: name: dashboard-kibana-ingress namespace: kube-system spec: rules: - host: dashboard.mritd.me http: paths: - backend: serviceName: kubernetes-dashboard servicePort: 80 - host: kibana.mritd.me http: paths: - backend serviceName: kibana-logging servicePort: 5601 装逼成功截图如下 三、部署 Ingress TLS 上面已经搞定了 Ingress,下面就顺便把 TLS 怼上;官方给出的样例很简单,大致步骤就两步:创建一个含有证书的 secret、在 Ingress 开启证书;但是我不得不喷一下,文档就提那么一嘴,大坑一堆,比如多域名配置,还有下面这文档特么的是逗我玩呢? 3.1、创建证书 首先第一步当然要有个证书,由于我这个 Ingress 有两个服务域名,所以证书要支持两个域名;生成证书命令如下: # 生成 CA 自签证书 mkdir cert && cd cert openssl genrsa -out ca-key.pem 2048 openssl req -x509 -new -nodes -key ca-key.pem -days 10000 -out ca.pem -subj "/CN=kube-ca" # 编辑 openssl 配置 cp /etc/pki/tls/openssl.cnf . vim openssl.cnf # 主要修改如下 [req] req_extensions = v3_req # 这行默认注释关着的 把注释删掉 # 下面配置是新增的 [ v3_req ] basicConstraints = CA:FALSE keyUsage = nonRepudiation, digitalSignature, keyEncipherment subjectAltName = @alt_names [alt_names] DNS.1 = dashboard.mritd.me DNS.2 = kibana.mritd.me # 生成证书 openssl genrsa -out ingress-key.pem 2048 openssl req -new -key ingress-key.pem -out ingress.csr -subj "/CN=kube-ingress" -config openssl.cnf openssl x509 -req -in ingress.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out ingress.pem -days 365 -extensions v3_req -extfile openssl.cnf 3.2、创建 secret 创建好证书以后,需要将证书内容放到 secret 中,secret 中全部内容需要 base64 编码,然后注意去掉换行符(变成一行);以下是我的 secret 样例(上一步中 ingress.pem 是证书,ingress-key.pem 是证书的 key) vim ingress-secret.yml apiVersion: v1 data: tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM5akNDQWQ2Z0F3SUJBZ0lKQU5TR2dNNnYvSVd5TUEwR0NTcUdTSWIzRFFFQkJRVUFNQkl4RURBT0JnTlYKQkFNTUIydDFZbVV0WTJFd0hoY05NVGN3TXpBME1USTBPRFF5V2hjTk1UZ3dNekEwTVRJME9EUXlXakFYTVJVdwpFd1lEVlFRRERBeHJkV0psTFdsdVozSmxjM013Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLCkFvSUJBUUM2dkNZRFhGSFpQOHI5Zk5jZXlkV015VVlELzAwQ2xnS0M2WjNpYWZ0QlRDK005TmcrQzloUjhJUE4KWW00cjZOMkw1MmNkcmZvQnBHZXovQVRIT0NJYUhJdlp1K1ZaTzNMZjcxZEVLR09nV21LMTliSVAzaGpSeDZhWQpIeGhEVWNab3ZzYWY1UWJHRnUydEF4L2doMTFMdXpTZWJkT0Y1dUMrWHBhTGVzWWdQUjhFS0cxS0VoRXBLMDFGCmc4MjhUU1g2TXVnVVZmWHZ1OUJRUXExVWw0Q2VMOXhQdVB5T3lMSktzbzNGOEFNUHFlaS9USWpsQVFSdmRLeFYKVUMzMnBtTHRlUFVBb2thNDRPdElmR3BIOTZybmFsMW0rMXp6YkdTemRFSEFaL2k1ZEZDNXJOaUthRmJnL2NBRwppalhlQ01xeGpzT3JLMEM4MDg4a0tjenJZK0JmQWdNQkFBR2pTakJJTUM0R0ExVWRFUVFuTUNXQ0VtUmhjMmhpCmIyRnlaQzV0Y21sMFpDNXRaWUlQYTJsaVlXNWhMbTF5YVhSa0xtMWxNQWtHQTFVZEV3UUNNQUF3Q3dZRFZSMFAKQkFRREFnWGdNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUJBUUNFN1ByRzh6MytyaGJESC8yNGJOeW5OUUNyYVM4NwphODJUUDNxMmsxUUJ1T0doS1pwR1N3SVRhWjNUY0pKMkQ2ZlRxbWJDUzlVeDF2ckYxMWhGTWg4MU9GMkF2MU4vCm5hSU12YlY5cVhYNG16eGNROHNjakVHZ285bnlDSVpuTFM5K2NXejhrOWQ1UHVaejE1TXg4T3g3OWJWVFpkZ0sKaEhCMGJ5UGgvdG9hMkNidnBmWUR4djRBdHlrSVRhSlFzekhnWHZnNXdwSjlySzlxZHd1RHA5T3JTNk03dmNOaQpseWxDTk52T3dNQ0h3emlyc01nQ1FRcVRVamtuNllLWmVsZVY0Mk1yazREVTlVWFFjZ2dEb1FKZEM0aWNwN0sxCkRPTDJURjFVUGN0ODFpNWt4NGYwcUw1aE1sNGhtK1BZRyt2MGIrMjZjOVlud3ROd24xdmMyZVZHCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K tls.key: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb3dJQkFBS0NBUUVBdXJ3bUExeFIyVC9LL1h6WEhzblZqTWxHQS85TkFwWUNndW1kNG1uN1FVd3ZqUFRZClBndllVZkNEeldKdUsramRpK2RuSGEzNkFhUm5zL3dFeHpnaUdoeUwyYnZsV1R0eTMrOVhSQ2hqb0ZwaXRmV3kKRDk0WTBjZW1tQjhZUTFIR2FMN0duK1VHeGhidHJRTWY0SWRkUzdzMG5tM1RoZWJndmw2V2kzckdJRDBmQkNodApTaElSS1N0TlJZUE52RTBsK2pMb0ZGWDE3N3ZRVUVLdFZKZUFuaS9jVDdqOGpzaXlTcktOeGZBREQ2bm92MHlJCjVRRUViM1NzVlZBdDlxWmk3WGoxQUtKR3VPRHJTSHhxUi9lcTUycGRadnRjODJ4a3MzUkJ3R2Y0dVhSUXVhelkKaW1oVzRQM0FCb28xM2dqS3NZN0RxeXRBdk5QUEpDbk02MlBnWHdJREFRQUJBb0lCQUJtRmIzaVVISWVocFYraAp1VkQyNnQzVUFHSzVlTS82cXBzenpLVk9NTTNLMk5EZUFkUHhFSDZhYlprYmM4MUNoVTBDc21BbkQvMDdlQVRzClU4YmFrQ2FiY2kydTlYaU5uSFNvcEhlblFYNS8rKys4aGJxUGN6cndtMzg4K0xieXJUaFJvcG5sMWxncWVBOW0KVnV2NzlDOU9oYkdGZHh4YzRxaUNDdmRETDJMbVc2bWhpcFRKQnF3bUZsNUhqeVphdGcyMVJ4WUtKZ003S1p6TAplYWU0bTJDR3R0bmNyUktodklaQWxKVmpyRWoxbmVNa3RHODFTT3QyN0FjeDRlSnozbmcwbjlYSmdMMHcwU05ZCmlwd3I5Uk5PaDkxSGFsQ3JlWVB3bDRwajIva0JIdnozMk9Qb2FOSDRQa2JaeTEzcks1bnFrMHBXdUthOEcyY00KLzY4cnQrRUNnWUVBN1NEeHRzRFFBK2JESGdUbi9iOGJZQ3VhQ2N4TDlObHIxd2tuTG56VVRzRnNkTDByUm1uZAp5bWQ4aU95ME04aUVBL0xKb3dPUGRRY240WFdWdS9XbWV5MzFVR2NIeHYvWlVSUlJuNzgvNmdjZUJSNzZJL2FzClIrNVQ1TEMyRmducVd2MzMvdG0rS0gwc0J4dEM3U2tSK3Y2UndVQk1jYnM3c0dUQlR4NVV2TkVDZ1lFQXlaaUcKbDBKY0dzWHhqd1JPQ0FLZytEMlJWQ3RBVmRHbjVMTmVwZUQ4bFNZZ3krZGxQaCt4VnRiY2JCV0E3WWJ4a1BwSAorZHg2Z0p3UWp1aGN3U25uOU9TcXRrZW04ZmhEZUZ2MkNDbXl4ZlMrc1VtMkxqVzM1NE1EK0FjcWtwc0xMTC9GCkIvK1JmcmhqZW5lRi9BaERLalowczJTNW9BR0xRVFk4aXBtM1ZpOENnWUJrZGVHUnNFd3dhdkpjNUcwNHBsODkKdGhzemJYYjhpNlJSWE5KWnNvN3JzcXgxSkxPUnlFWXJldjVhc0JXRUhyNDNRZ1BFNlR3OHMwUmxFMERWZWJRSApXYWdsWVJEOWNPVXJvWFVYUFpvaFZ0U1VETlNpcWQzQk42b1pKL2hzaTlUYXFlQUgrMDNCcjQ0WWtLY2cvSlplCmhMMVJaeUU3eWJ2MjlpaWprVkVMRVFLQmdRQ2ZQRUVqZlNFdmJLYnZKcUZVSm05clpZWkRpNTVYcXpFSXJyM1cKSEs2bVNPV2k2ZlhJYWxRem1hZW1JQjRrZ0hDUzZYNnMyQUJUVWZLcVR0UGxKK3EyUDJDd2RreGgySTNDcGpEaQpKYjIyS3luczg2SlpRY2t2cndjVmhPT1Z4YTIvL1FIdTNXblpSR0FmUGdXeEcvMmhmRDRWN1R2S0xTNEhwb1dQCm5QZDV0UUtCZ0QvNHZENmsyOGxaNDNmUWpPalhkV0ZTNzdyVFZwcXBXMlFoTDdHY0FuSXk5SDEvUWRaOXYxdVEKNFBSanJseEowdzhUYndCeEp3QUtnSzZmRDBXWmZzTlRLSG01V29kZUNPWi85WW13cmpPSkxEaUU3eFFNWFBzNQorMnpVeUFWVjlCaDI4cThSdnMweHplclQ1clRNQ1NGK0Q5NHVJUmkvL3ZUMGt4d05XdFZxCi0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg== kind: Secret metadata: name: ingress-secret namespace: kube-system type: Opaque 创建完成后 create 一下就可 ➜ ~ kubectl create -f ingress-secret.yml secret "ingress-secret" created 其实这个配置比如证书转码啥的没必要手动去做,可以直接使用下面的命令创建,这里写这么多只是为了把步骤写清晰 kubectl create secret tls ingress-secret --key cert/ingress-key.pem --cert cert/ingress.pem 3.3、重新部署 Ingress 生成完成后需要在 Ingress 中开启 TLS,Ingress 修改后如下 apiVersion: extensions/v1beta1 kind: Ingress metadata: name: dashboard-kibana-ingress namespace: kube-system spec: tls: - hosts: - dashboard.mritd.me - kibana.mritd.me secretName: ingress-secret rules: - host: dashboard.mritd.me http: paths: - backend: serviceName: kubernetes-dashboard servicePort: 80 - host: kibana.mritd.me http: paths: - backend: serviceName: kibana-logging servicePort: 5601 注意:一个 Ingress 只能使用一个 secret(secretName 段只能有一个),也就是说只能用一个证书,更直白的说就是如果你在一个 Ingress 中配置了多个域名,那么使用 TLS 的话必须保证证书支持该 Ingress 下所有域名;并且这个secretName一定要放在上面域名列表最后位置,否则会报错did not find expected key无法创建;同时上面的hosts段下域名必须跟下面的rules中完全匹配 更需要注意一点:之所以这里单独开一段就是因为有大坑;Kubernetes Ingress 默认情况下,当你不配置证书时,会默认给你一个 TLS 证书的,也就是说你 Ingress 中配置错了,比如写了2个secretName、或者hosts段中缺了某个域名,那么对于写了多个secretName的情况,所有域名全会走默认证书;对于hosts缺了某个域名的情况,缺失的域名将会走默认证书,部署时一定要验证一下证书,不能 “有了就行”;更新 Ingress 证书可能需要等一段时间才会生效 最后重新部署一下即可 ➜ ~ kubectl delete -f dashboard-kibana-ingress.yml ingress "dashboard-kibana-ingress" deleted ➜ ~ kubectl create -f dashboard-kibana-ingress.yml ingress "dashboard-kibana-ingress" created 注意:部署 TLS 后 80 端口会自动重定向到 443,最终访问截图如下 历时 5 个小时鼓捣,到此结束

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册