使用C++自编译opencv源码给python扩展CV2模块

公司最近做起了无人商店项目,需要识别人脸.人脸识别采用了海康的摄像头直接从摄像机抓图来自己识别人脸!先使用了标准的OpenCV   python库,最后效果不理想达不到可以需求的识别速度,希望能提高!
于是希望通过自己编译opencv的源码添加更多功能编译成pyd文件供python调用!
参考文档  https://docs.opencv.org/3.3.1/d3/d52/tutorial_windows_install.html  编译文档 https://docs.opencv.org/3.3.1/d5/de5/tutorial_py_setup_in_windows.html
各种安装包如下

第一步安装python3
64位系统 下的Python3.5。python3.5、pip为必备前提。python可在官网下载:https://www.python.org/downloads/windows/,建议使用exe installer,pip会随之安装。环境变量中加入python安装路径,
安装numpy,打开CMD窗口使用pip安装

pip install numpy
第二步安装vs2015_x64位的编译环境,安装选项如下,然后一路NEXT安装通过

第三步安装  cmake,cuda, doxygen的exe安装包,完成后重启机器,让所有的安装都生效
第四步 源码准备
双击opencv-3.4.0-vc14_vc15.exe 将源码解压到D盘根目录

在sources目录下新建一个dep文件夹,将eigen  openexr  TBB的源码解压到这个目录中

把OpenBLAS已经编译完成的压缩包 OpenBLAS-v0.2.19-Win64-int32.zip 解压到D盘根目录

第五步 启动cmake配置编译的参数

第三步选择刚OpenBLAS压缩包解压的路径,引入包和dll文件
第四步选择配置的时候一定要记得选着VS的版本和当前安装版本一致,否者会出现找不到编译器的异常
第五步检查生成代码完成后,直接点击第六步,通过VS打开项目
将debug改成Release 模式

找到INSTALL 鼠标右键选择菜单的生成按钮,大约几个小时候编译完成!编译完成后我们就可以在
python的安装目录下Python\Python35\Lib\site-packages找到生成好的PYD文件

此时我们就可以import CV2这个python模块 不报错就表示引起包成功

Docker 命令集

寻找网络镜像命令
docker search centos
[root@test ~]# docker search centos
名字 描述 下载次数 是否官方 是否是Dockerfile构建的
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMAT
docker.io docker.io/centos The official build of CentOS. 3301 [OK]
下载镜像
docker pull centos
查看镜像
docker images
删除镜像
docker rmi
容器命令
启动容器
docker run –name -h hostname
启动容器2
docker start CONTAINER ID
停止容器
docker stop CONTAINER ID
查看容器
docker ps -a
进入容器
docker exec | docker attach
删除容器
docker rm
进入后台运行容器
docker attach 68e5c66ee5c9 退出自动停止运行容器
进入容器
docker run –name mydocker -it docker.io/centos /bin/bash
-d 进入后台运行
–run 运行
–name 指定名字
-i 输入终端打开
-t 开一个伪终端
进入容器不退出
1、进入容器
docker run –name mydocker -it docker.io/centos /bin/bash
2、退出
3、启动容器
docker ps -a查询ID号
docker start ID号
4、获取Pid号
docker inspect –format “{{.State.Pid}}” 68e5c66ee5c9
5、进入容器而不退出
nsenter –target 19205 –mount –uts –ipc –net –pid 退出不停止运行容器
如果没有这个命令,需要安装util-linux包 nsenter
6、懒人写法
nsenter –target `docker inspect –format “{{.State.Pid}}” ID` –mount –uts –ipc –net –pid
docker 网络访问
docker run -P
-P 随机映射
-p hostport:containerPort
-p ip:hostPort:containerPort
-p ip::containerPort
-p hostPort:containerPort
-p hostPort:containerPort
数据卷管理
docker
-v /data
-v /src:/dsrc
-v /src:/src:ro
容器的制作
docker commit -m “my nginx” f443e801f545 shijia/my-nginx:v1
Docker file 的方式构建docker镜像
FROM 他的妈妈是谁(基础镜像)
MAINTAINER 告诉被人,你创造了他(维护者信息)
RUN 你想让他干啥(把命令前面加上RUN)
ADD 相当于cp命令(COPY文件,会自动解压)
WORKDIR 相当于cd命令(当前工作目录)
VOLUME 给我一个放行李的地方(目录挂载)
EXPOSE 我要打开的门是啥(端口)
RUN 奔跑吧,兄弟!(进程要一直运行下去)
Docker 案例
vim /opt/docker-file/nginx/Dockerfile
# This is My first Dockerfile
# Version 1.0
# Author : Shijia Zhang
#Base images
FROM centos
#MAINTAINER
MAINTAINER ShiJia Zhang
#ADD
ADD pcre-8.37.tar.gz /usr/local/src
ADD nginx-1.9.3.tar.gz /usr/local/src
#RUN
RUN yum -y install wget gcc gcc-c++ make openssl-devel
RUN useradd -s /sbin/nologin -M www
#WORKDIR
WORKDIR /usr/local/src/nginx-1.9.3
#RUN
RUN ./configure –prefix=/usr/local/nginx –user=www –group=www –with-http_ssl_module –with-http_stub_status_module –with-pcre=/usr/local/src/pcre-8.37 && make && make install
RUN echo “daemon off;” >> /usr/local/nginx/conf/nginx.conf
ENV PATH=/usr/local/nginx/sbin:$PATH
EXPOSE 80
CMD [“nginx”]
运行Dockerfile
docker build -t nginx-file:v1 /opt/docker-file/nginx/
其他命令
docker run -it –rm stree –cpu 1
–rm 容器运行完即可删除
–cpu 指定分多少颗CPU

Linux学习历程(持续更新整理中)

1.文件目录操作命令

     (1) ls   显示文件和目录列表

        a ls -l  显示文件的详细信息

        b ls -a 列出当前目录的所有文件,包含隐藏文件。

        c stat ‘目录/文件’   显示指定目录/文件的相关信息,比ls命令显示的内容更多

    (2) mkdir ‘目录’    创建目录

    (3) touch ‘文件名’    当前目录下创建一个空文件

    (4) echo ‘内容’>’文件名’   当前目录下生成一个带内容的文件

    (5) cat、tac ‘文件名’    查看文件中的文本内容

        a more、less分页显示文本文件内容

        b head、tail 分别显示文件开头和结尾部分

    (6) cp  ‘ 原始文件路径’ ‘复制到新的文件’   复制文件或者目录

    (7) rm ‘文件名’   删除文件

        a rm -r   同时删除该目录下的所有文件(递归删除)

        b rm -f  强制删除文件或者目录。       (c) rmdir  删除空目录

    (8) mv ‘原始文件’ ‘需要移动到的目录’  移动文件或者目录

        a mv ‘原始文件名’ ‘修改的文件名’    修改文件名称,将原始的文件名称修改为修改后的文件名称

    (9) find -name ‘文件名’   搜索当前目录及其子目录的结果,不过滤任何条件,直接返回所有查找到的文件

    (10) wc ‘文件名’   统计文本文档的行数,字数,字符数。

    (11) grep ‘查询的字符串’ ‘文件名’   在指定的文本文件中查找指定的字符串

    (12) tree 显示当前目录下的目录树

        a 切换到root用户下执行yum -y install tree 命令安装tree插件,安装之后执行tree会显示出对应的目录树

    (13) pwd  显示当前工作目录

    (14) ln -s  建立软链接文件   例如: ln -s /home/kencery/nginx/house/room   /home/root,给前面的文件做一个软连接放到/home/下的root连接(相当于windows下的快捷方式)。

2.备份压缩命令

 (1) gzip压缩(解压)文件或者目录,压缩文件后缀为gz

        a 命令格式  gzip [选项] 压缩(解压缩)的文件名  压缩:gzip ‘文件.tar/文件’      压缩

        b 参数

            b.1   -d 将压缩文件解压         gzip -d ‘压缩文件’       解压缩

            b.2   -l 对每个压缩文件,显示压缩文件的大小,未压缩文件的大小,压缩比,未压缩文件的名字

            b.3   -v 对每一个压缩和解压的文件,显示文件名和压缩比

            b.4   -num 用指定的数字num调整压缩的速度,-1或–fast表示最快压缩方法(低压缩比),-9或–best表示最慢压缩比(高压缩比),系统缺省值为6.        gzip -9(压缩比)  ‘文件.tar/文件’

    (2) bzip2压缩(解压)文件或者目录,压缩文件后缀为bz2

        a 命令格式 bzip2 [-cdz]  文件

        b 参数

            b.1   -d 解压缩的参数      bzip2 -d ‘压缩文件’  解压缩

            b.2   -z  压缩的参数      bzip2 -z ‘文件.tar/文件’  压缩

            b.3   -num 用指定的数字num调整压缩的速度,-1或–fast表示最快压缩方法(低压缩比),-9或–best表示最慢压缩比(高压缩比),系统缺省值为6.

    (3) tar文件、目录打(解)包

        a 命令格式 tar [-cxzjvf] 压缩打包文档的名称,欲打包目录参数

        b 参数

            b.1   -c 建立一个归档文件的参数命令

            b.2   -x 解开一个归档文件的参数命令

            b.3   -z 是否需要用gzip压缩

            b.4   -j 是否需要用bzip2压缩

            b.5   -v 压缩的过程中显示文件

            b.6   -f 使用档名,在f之后要立即接档名

            b.7   -tf 查看归档文件里面的文件

        c  备注说明

            c.1  仅打包,不压缩   tar  -cvf  /home/kencery/demo.tar    /home/kencery/demo

            c.2  打包后,已gzip压缩   tar  -zcvf  /home/kencery/demo.tar.gz    /home/kencery/demo

            c.3  打包后,已gzip压缩   tar  -jcvf  /home/kencery/demo.tar.bz2    /home/kencery/demo

                备注:参数-f之后的文件档名是自己取的,我们习惯上都用.tar来作为辨识

3.Vim编辑器的使用

    (1) 编辑模式:等待编辑命令输入                       vim ‘文件名’

    (2) 插入模式:编辑模式下,输入i、o、a进入插入模式,插入文本信息

    (3) 命令模式:在编辑模式下,输入”:”进行命令模式

        a 命令模式下的命令:

            a.1 直接退出Vi

            a.2 wq 保存后退出vi,并可以新建文件

            a.3 q!  强制退出,不会保存

            a.4 w file 将当前内容保存成某个文件

            a.5 set number 在编辑文件显示行号(在编辑模式下操作)

            a.6 set nonnumber 在编辑文件不显示行号(在编辑模式下操作)

4.文件权限管理

    (1) 查看文件和目录的权限(“R(4)”读权限、”W(2)”写权限、”X(1)”执行权限)

        a ls -l 文件名/目录

            drwxrwxr-x. 3 kencery kencery  4096 Mar 29 13:56 KenceryA

                a.1 显示信息包含:文件类型(d目录,-pu通文件,l连接文件),文件权限,文件的属主,文件的所属组,文件的大小,文件的创建时间,文件的名称

                a.2 从第二个字符起rwx是说明用户kencery有读、写、执行权限,接着的rwx表示用户组kencery也有读、写、执行权限,最后的r-x指其他人(other)只有读,执行权限,没有写权限。

    (2) 更改操作权限

        a chmod[u 属主,g 所属组用户,o 其他用户,a 所有用户][+ 加权限,-减权限,=加权限的同时将原有权限删除][rwx] 文件或者目录名

            a.1 对kencery.txt文件增加所属组用户增加写权限   chmod g+w kencery.txt

            a.2 对kencery.txt文件去掉所属组的写权限增加其他用户的执行权  chmod g-w,o+x kencery.txt

5.用户和组账户管理

    (1) 账户系统文件

        a cat /etc/passwd 每行定义一个用户账户,此文件对所有的用户可读,信息如下:

                root:x:0:0:root:/root:/bin/bash

                用户名:口令:用户标示号:组标示号:注释:宿主目录:命令解释器

            a.1 口令是X,说明用户的口令是被/etc/shadow文件保护的。

            a.2 用户标示号,系统内唯一,root用户的UID为0,普通用户从500/1000开始,1-499/999是系统的标准账户(每个Linux版本系统不一致)

            a.3 宿主目录,用户登录系统后所进入的目录

            a.4 命令解释器,制定该用户使用的shell,默认是/bin/bash。

        b cat /etc/shadow 为了增加系统的安全性,用户口令通常用shadow passwords保护,只有root可读,信息如下:              root:$6$/ZgfxO/0$Q2G6/CvI9hknSdsWW8xRy8QkBfZLCyhYyDIn2atfDgsEQf1SsNP9FTZ2B2BU9aOs4mXmY.FP0UQ2tib/UKrLq1:16701:0:99999:7:::

                用户名:口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间(7):不活动时间:失效时间:标志

        c cat /etc/group 将用户进行分组时Linux对用户进行管理及控制访问权限的一种手段,一个组中可以有多个用户,一个用户可以同时属于多个组,该文件对所有用户可读。

                组名:组口令:gid:组成员    root:x:0:

        d cat /etc/gshadow  该文件用户定义用户组口令,组管理员等信息,只有root用户可读。

                root:::

    (2) 对用户进行管理

        a 添加用户信息

                a.1 useradd/adduser 用户名   添加用户(备注:没有设置密码不能使用)   useradd/adduser  hyl

                a.2 useradd -u (UID号)

                a.3 useradd -p (口令)

                a.4 useradd -g(分组)

                a.5 useradd -s (sheel)

                a.6 useradd -d (用户目录)

        b 修改用户信息

                b.1 usermod -u(新的UID)

                b.2 usermod -d (用户目录)

                b.3 usermod -g (组名)

                b.4 usermod -s (sheel)

                b.5 usermod -p(新口令)

                b.6 usermod -l (新登录名)

                b.7 usermod -L(锁定用户账号密码)

                b.8 usermod -U (解锁用户账号)

        c.删除用户信息

                c.1 userdel 用户名(删除用户账号)

                c.2  userdel -r 用户名(删除用户账号的同时删除目录)

    (3) 对组账户进行管理

        a 添加组信息

            a.1 groupadd 组账户名(创建新组)

            a.2 groupadd -g 指定组GID

        b 修改组信息

            b.1 groupmod -g  更改组的GID

            a.2 groupmod -n 更改组账户名

        c 删除组信息

            c.1 groupdel 组账户名(删除指定组账户)

    (4) 口令维护命令

        a passwd 用户账户名(设置用户口令)    passwd ‘账户名’

        b passwd -l 用户账户名(锁定用户账户)

        c  passwd -u 用户账户名(解锁用户账户)

        d passwd -d 用户账户名(删除账户口令)

        e passwd -a 用户账户名 组账户名(将指定用户添加到指定组)

        f  passwd -d 用户账户名 组账户名(将用户从指定组中删除)

        g passwd -A 用户账户名 组账户名(将用户指定为组的管理员)

    (5) 用户和组状态命令

        a su 用户名  切换用户账户

            a.1 su ‘用户名’ 切换用户账户(不切换工作目录)

            a.2 su – ‘用户名’ 切换用户账户(切换工作目录)

        b sudo 是允许系统管理员让普通用户执行一些或全部的超级管理员(root)命令的一个工具(如:reboot,su…),这样不仅减少了root用户的登录和管理实践,同样也提高了安全性,sudo不是对shell的一个替代,它是面向每个命令的,它的主要特点有以下几点:

            b.1 cat /etc/sudoers   sudo文件的说明

        c grops ‘用户名’

6.系统管理命令

    (1) who 显示在线登录的用户并且查看以什么方式登录系统的。

    (2) hostname 显示主机名称、uname (-a)  显示系统信息

    (3) 线程/进程/内存/网络/磁盘使用情况

        a top 显示当前系统中耗费资源最多的进程(ctrl+c退出)

        b ps 显示瞬间的进程状态,和top的区别就是只获取当前瞬间的进程,获取之后将不会实时变化。

        c du (-h) 目录/文件  显示指定的文件(目录)已使用的磁盘空间的总量

        d df (-h)  显示文件系统磁盘的使用

        e free (-s2) 显示当前内存和交换空间的使用情况(两秒刷新一次)(ctrl+c退出)

        f ifconfig 显示网络接口信息

        g ping 测试网络的连通性           h  netstat 显示网络状态信息

    (4) man ‘命令’   命令帮助信息查询  (q退出)

    (5) alias ‘别名’ =’指令名’  设置命令别名     unalias ‘别名’   删除别名

    (6) clear 清屏

    (7) kill 杀死一个进程

    (8) 关机/重启命令

        a shutdown  系统关机

            a.1  -r 关机后重启            a.2 -h 关机后不重新启动      a.3  now 立即关机

        b halt 关机后关闭电源

        c reboot  重启心动

7.Linux目录结构

    1. bin 存放二进制可执行文件(ls,cat,mkdir,chmod)

    2. boot 存放用于系统引导时使用的各种文件

    3. data 数据文件夹,某些操作产生的临时文件夹

    4. dev 用于存放设备文件

    5. etc 存放系统配置文件

    6. home 存放所有用户文件的根目录

    7. lib 存放跟文件系统中的程序运行所需要的共享库以及内核模块

    8. lib64

    9. lost+found 使用标准的ext2/ext3档案系统格式才会产生一个目录,目的在于当档案发生错误时,将一些遗失的片段放置在这里目录下。

    10. media 软碟,光碟,DVD等挂载于此处

    11. mnt 系统管理员安装临时文件系统的安装点

    12. opt 额外安装的可选应用程序包所放置的位置

    13. proc 虚拟文件系统,存放当前内存的映射

    14. root 超级用户目录

    15. sbin 存放二进制可执行文件,只有root才能访问

    16. selinux

    17. srv 网络服务启动之后,这些服务所需要取用的资料目录,常见的服务ftp

    18. sys 虚拟的档案系统,记录与核心相关的咨询,包括目前载入的核心模组等,这个目录不占用硬盘容量

    29. tmp 用于存放各种临时文件

    20. usr 用于存放系统应用程序,比较重要的目录/usr/local本地管理员软件安装目录

    21. var 用于存放运行时需要改变数据的文件

ansible playbook

应客户需求某次给客户的提供的软件需要提供ansible playbook!   what???  什么鬼,接到这个任务我也是满脸懵逼!
好吧接下来我们看看这到底是个什么鬼!
 
Playbook是Ansible的配置,部署和编排语言。 他们可以描述您希望远程系统执行的策略,或一般IT流程中的一组步骤。
如果Ansible modules是您workshop的工具,则playbooks是您的说明手册,您的主机inventory是您的原材料。
在基本层面上,可以使用playbooks来管理远程机器的配置和部署。 在更高级别,他们可以对涉及滚动更新的多层次推出进行排序,并可以将操作委派给其他主机,与监控服务器进行交互,同时加载平衡器。
虽然这里有很多信息,但是不需要一次就可以学习所有的东西。 随着时间的推移,您可以开始小型化,随时随地选择更多功能。
playbooks旨在让人可读,并以基本的文字语言开发。 可以通过多种方法来组织playbooks和他们包含的文件,我们将提供一些建议,并充分利用“可复制”。
建议您阅读“ Playbook ”文档,同时阅读“ 示例手册” 。 这些说明了最佳实践以及如何将许多各种概念集中在一起。

关于Playbooks

Playbook是一种与adhoc任务执行模式完全不同的方式,而且特别强大。
简单地说,Playbooks是一个非常简单的配置管理和多机器部署系统的基础,不像任何已经存在的那样,而且非常适合部署复杂的应用程序。
Playbook可以声明配置,但它们也可以协调任何手动订购过程的步骤,即使不同的步骤必须在特定订单的机器组之间来回弹起。 他们可以同步或异步地启动任务。
虽然您可以运行主/usr/bin/ansible程序来进行自组织任务,但是Playbook更有可能被保留在源代码管理中,并用于推出配置或确保远程系统的配置符合规范。
还有一些完整的剧本可以ansible-examples存储库中说明很多这些技术。 我们建议您在另一个标签中查看这些内容。
在学习剧本之后,还有很多跳跃点,所以在完成本节之后,请回到文档索引。

Playbook Language Example

Playbook以YAML格式(见YAML Syntax )表示,并具有最少的语法,它有意尝试不是编程语言或脚本,而是一个配置或进程的模型。
每个playbook由一个或多个“plays”组成。
一个play的目标是将一组主机映射到一些明确定义的roles,由事件可调用的任务代表。 在基本层面上,一个任务只不过是对一个可以粘贴的模块的调用(参见关于模块 )。
通过编写多个“plays”的playbook,可以协调多机器部署,在Web服务器组中的所有计算机上运行某些步骤,然后在数据库服务器组上执行某些步骤,然后在Web服务器组等上再次执行命令。
“plays”或多或少是体育比喻。 你可以有很多戏剧影响你的系统做不同的事情。 它不像你只是定义一个特定的状态或模型,你可以在不同的时间运行不同的play。
对于初学者来说,这是一个仅包含一个play的playbook:

---
- hosts: webservers
  vars:
    http_port: 80
    max_clients: 200
  remote_user: root
  tasks:
  - name: ensure apache is at the latest version
    yum: name=httpd state=latest
  - name: write the apache config file
    template: src=/srv/httpd.j2 dest=/etc/httpd.conf
    notify:
    - restart apache
  - name: ensure apache is running (and enable it at boot)
    service: name=httpd state=started enabled=yes
  handlers:
    - name: restart apache
      service: name=httpd state=restarted

当使用具有很长参数的任务或具有许多参数的模块时,可以通过多行将任务项目中断以改进结构。 以下是上述示例的另一个版本,但是使用YAML字典为它们的key=value参数提供模块:

---
- hosts: webservers
  vars:
    http_port: 80
    max_clients: 200
  remote_user: root
  tasks:
  - name: ensure apache is at the latest version
    yum:
      name: httpd
      state: latest
  - name: write the apache config file
    template:
      src: /srv/httpd.j2
      dest: /etc/httpd.conf
    notify:
    - restart apache
  - name: ensure apache is running
    service:
      name: httpd
      state: started
  handlers:
    - name: restart apache
      service:
        name: httpd
        state: restarted
Playbook可以包含多个play。 您可能有一个Playbook首先定位到Web服务器,然后是数据库服务器。 例如:
---
- hosts: webservers
  remote_user: root
  tasks:
  - name: ensure apache is at the latest version
    yum: name=httpd state=latest
  - name: write the apache config file
    template: src=/srv/httpd.j2 dest=/etc/httpd.conf
- hosts: databases
  remote_user: root
  tasks:
  - name: ensure postgresql is at the latest version
    yum: name=postgresql state=latest
  - name: ensure that postgresql is started
    service: name=postgresql state=started
您可以使用此方法在您要定位的主机组,登录到远程服务器的用户名,是否要sudo之间进行切换。 play,像任务一样,按照playbook中指定的顺序运行:从上到下。

Basics

Hosts and Users

对于Playbook中的每个play,您可以选择您的基础设施中的哪些机器进行定位,以及什么远程用户完成步骤(称为任务)。
hosts行是一个或多个组或主机模式的列表,以冒号分隔,如“ 模式”文档中所述。 remote_user只是用户帐户的名称:

---
- hosts: webservers
  remote_user: root
还可以为每个任务定义远程用户:
---
- hosts: webservers
  remote_user: root
  tasks:
    - name: test connection
      ping:
      remote_user: yourname
支持作为其他用户来运行(请参阅Become (Privilege Escalation) ):
---
- hosts: webservers
  remote_user: yourname
  become: yes
您也可以使用成为特定任务而不是整个play:
---
- hosts: webservers
  remote_user: yourname
  tasks:
    - service: name=nginx state=started
      become: yes
      become_method: sudo
您也可以登录,然后成为与root不同的用户:
---
- hosts: webservers
  remote_user: yourname
  become: yes
  become_user: postgres

您还可以使用其他权限升级方法,如su:
---
- hosts: webservers
  remote_user: yourname
  become: yes
  become_method: su
如果需要指定sudo的密码,请使用--ask-become-pass或使用旧的sudo语法--ask-sudo-pass-K )运行ansible-playbook 。 如果你运行成为playbook,并且playbook似乎挂起,它可能会停留在特权升级提示符下。 只要控制C来杀死它并再次运行,添加相应的密码。 您还可以控制运行主机的顺序。 默认是按照inventory提供的顺序: 
- hosts: all
  order: sorted
  gather_facts: False
  tasks:
    - debug: var=inventory_hostname
order的可能值为:
inventory:
 默认值。 该order是由“inventory”提供的
reverse_inventory:
 顾名思义,将inventory提供的顺序反过来了
sorted:
主机按名称的字母顺序排列
reverse_sorted:
反向
shuffle:
Hosts are randomly ordered each run主机每次运行随机顺序

Tasks list

每个play包含一个任务列表。 任务按顺序执行,一次一个地执行与主机模式匹配的所有计算机,然后再转到下一个任务。 重要的是要明白,在一个playbook中,所有的主机都要得到相同的任务指令。 play的目的是将选择的主机映射到任务。
当运行从上到下运行的playbook时,失败任务的主机将从整个playbook的旋转中取出。 如果事情失败,只需更正playbook文件并重新运行。

每个任务的目标是执行一个非常具体的参数的模块。 如上所述,变量可以在模块的参数中使用。
模块应该是幂等的,也就是说,按顺序运行一个模块多次应该具有一样的运行效果。 实现幂等的一种方法是使模块检查其所期望的最终状态是否已经实现,并且如果该状态已经实现,
则在不执行任何动作的情况下退出。 如果一个playbook所使用的所有模块都是幂等的,那么这个playbook本身就有可能是幂等的,所以重新运行这个playbook应该是安全的。
commandshell模块通常会重新运行相同的命令,如果命令类似于chmodsetsebool等,则完全可以。尽管有一个可用于创建这些模块的creates标志也是幂等的。 每个任务都应该有一个name ,它包含在运行该play的输出中。 这是人类可读的输出,因此提供每个任务步骤的良好描述是有用的。 如果没有提供名称,则将“feed”的字符串用作输出。 可以使用旧版action: module options格式声明任务,但建议您使用更常规的module: options格式。 在整个文档中使用了这种推荐的格式,但是您可能会在某些playbook中遇到较旧的格式。 这是一个基本的任务。 与大多数模块一样,服务模块采用key=value参数: 
tasks:
  - name: make sure apache is running
    service: name=httpd state=started

commandshell模块是唯一获取参数列表而不使用key=value表单的模块。 这使得他们按照你所期望的方式工作:
tasks:
  - name: enable selinux
    command: /sbin/setenforce 1
commandshell模块关心返回代码,所以如果你有一个成功的退出代码不为零的命令,你可能希望这样做:
tasks:
  - name: run this command and ignore the result
    shell: /usr/bin/somecommand || /bin/true
或这个:
tasks:
  - name: run this command and ignore the result
    shell: /usr/bin/somecommand
    ignore_errors: True
如果行动线太长了,你可以在一个空间上打破它,并缩进任何延续线:
tasks:
  - name: Copy ansible inventory file to client
    copy: src=/etc/ansible/hosts dest=/etc/ansible/hosts
            owner=root group=root mode=0644
变量可以在动作行中使用。 假设您在vars部分中定义了一个名为vhostvars ,您可以这样做: 
tasks:
  - name: create a virtual host file for {{ vhost }}
    template: src=somefile.j2 dest=/etc/httpd/conf.d/{{ vhost }}

Action Shorthand

可选择在0.8及更高版本中列出这样的模块:

  template : src = templates / foo.j2 dest = / etc / foo.conf

您会注意到在早期版本中,这只能用作:

  action : template src = templates / foo.j2 dest = / etc / foo.conf

旧的表单继续在较新的版本中工作,没有任何弃用的计划。

Handlers: Running Operations On Change

如上所述,模块应该是幂等的,并且可以在远程系统上进行更改时进行中继。 Playbook认识到这一点,并有一个基本的事件系统可以用来响应变化。
这些“通知”动作在play中每个任务块的末尾触发,只有在多个不同任务通知时才会被触发一次。
例如,多个资源可能表明apache需要重新启动,因为它们已经更改了一个配置文件,但apache只会被triggered一次以避免不必要的重新启动。
以下是当文件内容更改时重新启动两个服务的示例,但仅当文件更改时:

- name: template configuration file
  template: src=template.j2 dest=/etc/foo.conf
  notify:
     - restart memcached
     - restart apache
任务notify部分列出的内容称为处理程序。 处理程序是由全局唯一名称引用的任务列表,与常规任务完全没有任何区别,并由通知程序通知。 如果没有通知处理程序,它将不会运行。 无论通过处理程序有多少任务,在所有任务在特定的play中完成后,它将只运行一次。 这是一个示例处理程序部分: 
handlers:
    - name: restart memcached
      service: name=memcached state=restarted
    - name: restart apache
      service: name=apache state=restarted
至于Ansible 2.2,处理程序也可以“listen”通用主题,任务可以通知这些主题如下:
handlers:
    - name: restart memcached
      service: name=memcached state=restarted
      listen: "restart web services"
    - name: restart apache
      service: name=apache state=restarted
      listen: "restart web services"
tasks:
    - name: restart everything
      command: echo "this task will restart the web services"
      notify: "restart web services"
这种使用可以更容易地触发多个处理程序。 它也使处理程序与名称分离,从而更容易在剧本和角色之间共享处理程序(特别是当使用像Galaxy这样的共享源的第三方角色时)。
角色将在后面描述,但值得指出的是:
  • pre_tasks , taskspost_tasks部分内通知的处理程序将在通知的部分的末尾自动刷新;
  • roles部分内通知的处理程序将在roles部分结束时自动刷新,但在任何tasks处理程序之前。

如果您想要立即刷新所有处理程序命令,在1.2及更高版本中,您可以:

tasks:
   - shell: some tasks go here
   - meta: flush_handlers
   - shell: some other tasks
在上述示例中,任何排队处理程序将在达到meta语句时提前处理。 这是一个niche的例子,但可以不时地派上用场。 

Executing A Playbook

现在你已经学会了Playbook的语法,你如何运行一个playbook? 这很简单。 让我们用10级的并行度来运行一个playbook:

ansible-playbook playbook.yml -f 10

Ansible-Pull

如果你想反转Ansible的架构,那么节点就可以检查到一个中央位置,而不是把配置推送给他们,你可以。
ansible-pull是一个小脚本,可以从git检出配置指令的备份,然后针对该内容运行ansible-playbook 。
假设您负载平衡您的checkout位置,基本无限可ansible-pull秤。
运行ansible-pull --help帮助详细信息。
还有一个clever playbook可以通过推送模式下的crontab来配置安全性。

Tips and Tricks

要检查playbook的语法,请使用带有--syntax-check标志的--syntax-check ansible-playbook 。 这将通过解析器运行playbook文件,以确保其包含的文件,角色等没有语法问题。
查看playbook执行的底部以获取目标节点的总结以及它们的执行情况。 一般失败和致命的“不可达到”的通信尝试在计数中保持分开。
如果您想查看成功模块以及不成功模块的详细输出,请使用--verbose标志。 这在可用0.5和更高版本中可用。
如果安装了cowsay包,可靠的剧本输出将大大提升。 尝试一下!
在运行它之前,要查看playbook会受到哪些主机的影响,您可以执行以下操作:

  ansible-playbook playbook.yml --list-hosts

挖矿病毒清理

早上到公司后,发现公司的阿里云上的服务器突然莫名其妙的CPU一直在报警!导致服务基本上不可以用!
用top命令查看了一下,cpu被占用接近100%,所以无法运行新程序,通过top命令然后输入P,就能看到有两个程序几乎占用了所有的CPU,占用率为700%左右,程序名称为:minerd和AnXqV两个,通过搜索知道是挖矿程序,通过kill命令及pkill命令是无法直接解决的,找到了一个教程http://blog.csdn.net/hu_wen/article/details/51908597,看来受害者不少!
 
以下为原文搬砖
在确定跟项目不相关的情况下判断是个木马程序,果断kill掉进程,然后删除/opt下minerd文件
本想这样可以解决,谁想不到15秒时间,又自动启动起来,而且文件又自动创建,这个让我想起了crontab的定时器,果然运维同事一查确实定时器存在一条:,果断删除处理。再杀进程,再删文件;然并卵,依旧起来;

百度资料说该根源可能是通过jenkins开放外网被黑客入侵导致,接着就把jenkins服务停止,把外网端口关闭,顺道把服务器的所有用户密码及ssh改了一遍,再把minerd进程杀掉,删文件,但是还是不行。
http://www.myhack58.com/Article/48/66/2014/56680.htm
继续百度各种资料,检查是否存在其它定时器,在/var/spool/cron/目录下发现有个root用户的定时器文件,以为找到根源了,再次果断删除,结果,还是没有解决;
后面同事在google搜索到了一个资料,
http://security.stackexchange.com/questions/129448/how-can-i-kill-minerd-malware-on-an-aws-ec2-instance

各种文件删除都不起作用,原来该木马程序注册了一个“lady”的服务,而且还是开机启动,起一个这个可爱的名字,谁TMD知道这是一个木马。
把lady服务停止,删除开机启动,删除文件,恢复正常!
—2017 02 21 补充
很有网友也遇到跟我同样的问题,但是木马程序确实有点嚣张,通过利用redis的免帐号密码漏洞进行入侵

Redis 未授权访问缺陷可轻易导致系统被黑


1. 修复 redis 的后门缺陷

  1. 配置bind选项, 限定可以连接Redis服务器的IP, 并修改redis的默认端口6379
  2. 配置AUTH, 设置密码, 密码会以明文方式保存在redis配置文件中.
  3. 配置rename-command CONFIG “RENAME_CONFIG”, 这样即使存在未授权访问, 也能够给攻击者使用config指令加大难度
  4. 好消息是Redis作者表示将会开发”real user”,区分普通用户和admin权限,普通用户将会被禁止运行某些命令,如conf

2. 打开 ~/.ssh/authorized_keys, 删除你不认识的密钥
3. 删除用户列表中陌生的帐号

Python3+Selenium web自动化测试(六)

工欲善其事必先利其器,我们编辑代码和程序肯定是需要使用工具的,下面我们来安装pycharm

windows下PyCharm安装及使用

搭建环境

1、win10_X64,其他Win版本也可以。
2、PyCharm版本:Professional-2016.2.3。

搭建准备

1、到PyCharm官网下载PyCharm安装包。

Download

2、选择Windows系统的专业版下载。

下载

3、下载好的安装包。

安装包信息

安装软件

1、双击安装包进行安装。

安装软件

2、自定义软件安装路径(建议路径中不要中文字符)。

自定义安装路径

3、创建桌面快捷方式并关联*.py文件。

创建快捷方式

4、选择开始菜单文件夹(默认即可),点击安装。

选择文件夹

5、耐心等待安装。

等待安装

6、安装完成,勾选立即运行PyCharm。

安装完成

7、选择是否导入开发环境配置文件,我们选择不导入。

导入配置文件

8、阅读协议并同意(少年,选择略过吧)。

阅读协议

9、选择输入激活码激活软件(请阅读下一步获取激活码)。

激活软件

10、软件激活方式
1、推荐购买正版软件。
2、可以选择下载社区版本,免费的。
3、专业版本可以选择试用,免费试用30天。
4、网上寻找激活码或授权服务器。
我们使用第4种方法:
IntelliJ IDEA 注册码网站,获取激活码,以前允许自定义用户名,现在已经是No了,只能直接获取激活码。

获取注册码

点击获取激活码后,文本默认是全选中的,直接右击选择复制即可。

复制激活码

11、将激活码粘贴到文本框,点击OK即可。

粘贴激活码

12、PyCharm的欢迎界面。

欢迎界面

13、选择IDE主题与编辑区主题,建议Darcula主题(温馨提示:黑色更有利于保护眼睛噢!!!)。

选择主题

14、由于我们更改主题,故会提示重启IDE,选择Yes。

重启IDE

15、选择创建新项目。

创建新项目

16、自定义项目存储路径,IDE默认会关联Python解释器。

配置项目

17、IDE提供的提示,我选择在启动时不显示提示。

关闭提示

Linux 下如何将要发布的项目制作成RPM安装包

开始前的准备
安装rpmbuild软件包

  • yum -y install rpm-build

生成相关目录
要生成rpm相关目录,可以手动创建,也可以通过rpmbuild命令创建。如:

[root@yang data]# rpmbuild zabbix_agentd_ops.spec 
error: File /root/rpmbuild/SOURCES/zabbix-3.0.3.tar.gz: No such file or directory
有报错,无需理会,可以看到rpmbuild目录已经创建完成
[root@yang ~]# tree rpmbuild/
rpmbuild/
├── BUILD
├── BUILDROOT
├── RPMS
├── SOURCES
├── SPECS
└── SRPMS

编写SPEC文件
SPEC关键字
Name: 软件包的名称,后面可使用%{name}的方式引用
Summary: 软件包的内容概要
Version: 软件的实际版本号,例如:1.0.1等,后面可使用%{version}引用
Release: 发布序列号,例如:1linuxing等,标明第几次打包,后面可使用%{release}引用
Group: 软件分组,建议使用标准分组
License: 软件授权方式,通常就是GPL
Source: 源代码包,可以带多个用Source1、Source2等源,后面也可以用%{source1}、%{source2}引用
BuildRoot: 这个是安装或编译时使用的“虚拟目录”,考虑到多用户的环境,一般定义为:%{tmppath}/{name}-%{version}-%{release}-root或%{tmppath}/%{name}-%{version}-%{release}-buildroot-%%__id_u} -n}.该参数非常重要,因为在生成rpm的过程中,执行make install时就会把软件安装到上述的路径中,在打包的时候,同样依赖“虚拟目录”为“根目录”进行操作。后面可使用$RPM_BUILD_ROOT 方式引用。
URL: 软件的主页
Vendor: 发行商或打包组织的信息,例如RedFlag Co,Ltd
Disstribution: 发行版标识
Patch: 补丁源码,可使用Patch1、Patch2等标识多个补丁,使用%patch0或%{patch0}引用
Prefix: %{_prefix} 这个主要是为了解决今后安装rpm包时,并不一定把软件安装到rpm中打包的目录的情况。这样,必须在这里定义该标识,并在编写%install脚本的时候引用,才能实现rpm安装时重新指定位置的功能
Prefix: %{sysconfdir} 这个原因和上面的一样,但由于%{prefix}指/usr,而对于其他的文件,例如/etc下的配置文件,则需要用%{_sysconfdir}标识
Build Arch: 指编译的目标处理器架构,noarch标识不指定,但通常都是以/usr/lib/rpm/marcros中的内容为默认值
Requires: 该rpm包所依赖的软件包名称,可以用>=或<=表示大于或小于某一特定版本,例如:libpng-devel >= 1.0.20 zlib ※“>=”号两边需用空格隔开,而不同软件名称也用空格分开,还有例如PreReq、Requires(pre)、Requires(post)、Requires(preun)、Requires(postun)、BuildRequires等都是针对不同阶段的依赖指定
Provides: 指明本软件一些特定的功能,以便其他rpm识别
Packager: 打包者的信息
%description 软件的详细说明
SPEC脚本主体
%prep 预处理脚本
%setup -n %{name}-%{version}** 把源码包解压并放好通常是从/usr/src/asianux/SOURCES里的包解压到/usr/src/asianux/BUILD/%{name}-%{version}中。一般用%setup -c就可以了,但有两种情况:一就是同时编译多个源码包,二就是源码的tar包的名称与解压出来的目录不一致,此时,就需要使用-n参数指定一下了。
%patch 打补丁通常补丁都会一起在源码tar.gz包中,或放到SOURCES目录下。一般参数为:

  • %patch -p1 使用前面定义的Patch补丁进行,-p1是忽略patch的第一层目
  • %Patch2 -p1 -b xxx.patch 打上指定的补丁,-b是指生成备份文件

补充

  • %setup 不加任何选项,仅将软件包打开。
  • %setup -n newdir 将软件包解压在newdir目录。
  • %setup -c 解压缩之前先产生目录。
  • %setup -b num 将第num个source文件解压缩。
  • %setup -T 不使用default的解压缩操作。
  • %setup -T -b 0 将第0个源代码文件解压缩。
  • %setup -c -n newdir 指定目录名称newdir,并在此目录产生rpm套件。
  • %patch 最简单的补丁方式,自动指定patch level。
  • %patch 0 使用第0个补丁文件,相当于%patch ?p 0。
  • %patch -s 不显示打补丁时的信息。
  • %patch -T 将所有打补丁时产生的输出文件删除。

%configure 这个不是关键字,而是rpm定义的标准宏命令。意思是执行源代码的configure配置,在/usr/src/asianux/BUILD/%{name}-%{version}目录中进行 ,使用标准写法,会引用/usr/lib/rpm/marcros中定义的参数。另一种不标准的写法是,可参考源码中的参数自定义,例如:

引用CFLAGS="$RPM_OPT_FLAGS" CXXFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=%{_prefix}

 
%build 开始构建包,在/usr/src/asianux/BUILD/%{name}-%{version}目录中进行make的工作
%install 开始把软件安装到虚拟的根目录中.在/usr/src/asianux/BUILD/%{name}-%{version}目录中进行make install的操作。这个很重要,因为如果这里的路径不对的话,则下面%file中寻找文件的时候就会失败。 常见内容有:

  • %makeinstall 这不是关键字,而是rpm定义的标准宏命令。也可以使用非标准写法:make DESTDIR=$RPM_BUILD_ROOT install或引用make prefix=$RPM_BUILD_ROOT install
  • 需要说明的是,这里的%install主要就是为了后面的%file服务的。所以,还可以使用常规的系统命令:引用install -d $RPM_BUILD_ROOT/和cp -a * $RPM_BUILD_ROOT/

%clean 清理临时文件
%pre   rpm安装前执行的脚本
%post rpm安装后执行的脚本
%preun   rpm卸载前执行的脚本
%postun rpm卸载后执行的脚本
%files 定义那些文件或目录会放入rpm中
%defattr (-,root,root)** 指定包装文件的属性,分别是(mode,owner,group),-表示默认值,对文本文件是0644,可执行文件是0755
%changelog  变更日志
实例:

%define zabbix_user zabbix                  #自定义宏,名字为zabbix_user值为zabbix,%{zabbix_user}引用
Name:   zabbix                              #软件包的名字,后面可用%{name}引用
Version:    3.0.3                           #软件的实际版本号,可使用%{version}引用
Release:    1%{?dist}                       #发布序列号,标明第几次打包  
Summary:    zabbix_agentd                   #软件包内容概要
Group:      zabbix                          #软件包分组
License:    GPL                             #授权许可方式
URL:        www.yang.com                    #软件的主页
Source0:    zabbix-3.0.3.tar.gz             #源代码包,可以有Source0,Source1等源
BuildRequires:      gcc, gcc-c++            #制作rpm包时,所依赖的基本库
Requires:   gcc, gcc-c++, chkconfig         #安装rpm包时,所依赖的软件包
%description                                #定义rpm包的描述信息
Zabbix agentd 3.0.3
%pre                                        #rpm包安装前执行的脚本
grep zabbix /etc/passwd > /dev/null
if [ $? != 0 ]
then useradd zabbix -M -s /sbin/nologin
fi
[ -d /etc/zabbix   ]||rm -rf /etc/zabbix*
%post                                       #rpm包安装后执行的脚本
sed -i "/^ServerActive=/c\ServerActive=172.30.17.35" /etc/zabbix/etc/zabbix_agentd.conf
sed -i "/^Server=/c\Server=172.30.17.35" /etc/zabbix/etc/zabbix_agentd.conf
sed -i "/Timeout=3/c\Timeout=30" /etc/zabbix/etc/zabbix_agentd.conf
sed -i "/HostMetadata=/c\HostMetadata=PostgreSQL" /etc/zabbix/etc/zabbix_agentd.conf
sed -i "/^Hostname=/c\Hostname=PostgreSQL" /etc/zabbix/etc/zabbix_agentd.conf
echo "UnsafeUserParameters=1" >>/etc/zabbix/etc/zabbix_agentd.conf
echo "EnableRemoteCommands=1" >>/etc/zabbix/etc/zabbix_agentd.conf
echo "Include=/etc/zabbix/etc/zabbix_agentd.conf.d/*.conf" >>/etc/zabbix/etc/zabbix_agentd.conf
chkconfig zabbix_agentd on
%preun                                      #rpm卸载前执行的脚本
systemctl stop zabbix_agentd
%postun                                     #rpm卸载后执行的脚本
userdel  zabbix
rm -rf /etc/zabbix*
%prep                                       #这个宏开始
%setup -q                                   #解压并cd到相关目录
%build                                      #定义编译软件包时的操作
./configure --prefix=/etc/%{name}-%{version}   --enable-agent
make -j16 %{?_smp_mflags}
%install                                    #定义安装软件包,使用默认值即可
test -L %{buildroot}/etc/%{name} && rm -f %{buildroot}/etc/%{name}
install -d %{buildroot}/etc/profile.d
install -d %{buildroot}/etc/init.d
make install DESTDIR=%{buildroot}
echo 'export PATH=/etc/zabbix/bin:/etc/zabbix/sbin:$PATH' > %{buildroot}/etc/profile.d/%{name}.sh
ln -sf /etc/%{name}-%{version}          %{buildroot}/etc/%{name}
cp %{_buildrootdir}/postgresql.conf         %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/postgresql.conf
cp %{_buildrootdir}/tcp_connections.sh      %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/tcp_connections.sh
cp %{_buildrootdir}/iostat-collect.sh       %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/iostat-collect.sh
cp %{_buildrootdir}/iostat-parse.sh     %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/iostat-parse.sh
cp %{_buildrootdir}/iostat-zabbix.conf      %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/iostat-zabbix.conf
cp %{_buildrootdir}/zabbix_agentd       %{buildroot}/etc/init.d/zabbix_agentd
%files                                      #定义rpm包安装时创建的相关目录及文件。在该选项中%defattr (-,root,root)一定要注意。它是指定安装文件的属性,分别是(mode,owner,group),-表示默认值,对文本文件是0644,可执行文件是0755。
/etc/%{name}
/etc/%{name}-%{version}/*
/etc/init.d/zabbix_agentd
/etc/profile.d/%{name}.sh
%changelog                                  #主要用于软件的变更日志。该选项可有可无
%clean
rm -rf %{buildroot}                         #清理临时文件

RPM包制作拓展
如果想为zabbix增加启动控制脚本或一些其他的配置文件,可以将其放在SOURCE下,然后复制过去

  • 将启动脚本放在SOURCE目录
      [root@yang ~/rpmbuild/SOURCES]# ll
      total 15116
      -rwxr-xr-x 1 root root      362 Aug  1 12:03 hostmonitor.conf
      -rwxr-xr-x 1 root root      505 Aug  1 12:03 iostat-collect.sh
      -rwxr-xr-x 1 root root      953 Aug  1 12:03 iostat-parse.sh
      -rw-r--r-- 1 root root      772 Aug  1 12:03 iostat-zabbix.conf
      -rwxr-xr-x 1 root root      813 Aug  1 12:03 nginx_monitor.sh
      -rw-r--r-- 1 root root    14868 Aug  1 12:03 postgresql.conf
      -rw-r--r-- 1 root root       77 Aug  1 12:03 process.discovery
      -rw-r--r-- 1 root root      552 Aug  1 12:03 redis_check.conf
      -rw-r--r-- 1 root root      356 Aug  1 12:03 redis_cluster_check.py
      -rw-r--r-- 1 root root      363 Aug  1 12:03 redis_multiport_check.py
      -rwxr-xr-x 1 root root      783 Aug  1 12:03 tcp_connections.sh
      -rw-r--r-- 1 root root      852 Aug  1 12:03 userparameter_nginx.conf
      -rw-r--r-- 1 root root      172 Aug  1 12:03 userparameter_process.conf
      -rw-r--r-- 1 root root 15407273 Jul 20 10:53 zabbix-3.0.3.tar.gz
      -rwxr-xr-x 1 root root     2182 Aug  1 12:03 zabbix_agentd
  • 编辑 SPEC文件
    • Source0下增加如下:
        Source0:        zabbix-3.0.3.tar.gz
        Source1:        zabbix_agentd
        Source2:        nginx_monitor.sh
        Source3:        userparameter_nginx.conf
        Source4:        hostmonitor.conf
        Source5:        process.discovery
        Source6:        userparameter_process.conf
        Source7:        redis_check.conf
        Source8:        redis_cluster_check.py
        Source9:        redis_multiport_check.py
        Source10:       tcp_connections.sh
        Source11:       iostat-collect.sh
        Source12:       iostat-parse.sh
        Source13:       iostat-zabbix.conf
  • 安装区域增加如下行:
        make install DESTDIR=%{buildroot}
        install -p -D -m 0755 %{SOURCE1}        %{buildroot}/etc/init.d/zabbix_agentd
        install -p -D         %{SOURCE2}        %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/nginx_monitor.sh
        install -p -D         %{SOURCE3}        %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/userparameter_nginx.conf
        install -p -D         %{SOURCE4}        %{buildroot}/etc/nginx/conf.d/hostmonitor.conf
        install -p -D         %{SOURCE5}        %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/process.discovery
        install -p -D         %{SOURCE6}        %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/userparameter_process.conf
        install -p -D         %{SOURCE7}        %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/redis_check.conf
        install -p -D         %{SOURCE8}        %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/redis_cluster_check.py
        install -p -D         %{SOURCE9}        %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/redis_multiport_check.py
        install -p -D         %{SOURCE10}       %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/tcp_connections.sh
        install -p -D         %{SOURCE11}       %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/iostat-collect.sh
        install -p -D         %{SOURCE12}       %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/iostat-parse.sh
        install -p -D         %{SOURCE13}       %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/iostat-zabbix.conf
  • %file区域增加如下行:
        %files
        %defattr (-,root,root,0755)
        /etc/%{name}
        /etc/%{name}-%{version}/*
        /etc/profile.d/%{name}.sh
        /etc/nginx/conf.d/hostmonitor.conf
        %attr(0755,root,root) /etc/rc.d/init.d/zabbix_agentd

以下为完整的SPEC文件:

Name:   zabbix
Version:    3.0.3
Release:    1%{?dist}
Summary:    zabbix_agentd
Group:      zabbix
License:    GPL
URL:        www.yang.com
Source0:    zabbix-3.0.3.tar.gz
Source1:    zabbix_agentd
Source2:    nginx_monitor.sh
Source3:    userparameter_nginx.conf
Source4:    hostmonitor.conf
Source5:    process.discovery
Source6:    userparameter_process.conf
Source7:    redis_check.conf
Source8:    redis_cluster_check.py
Source9:    redis_multiport_check.py
Source10:   tcp_connections.sh
Source11:   iostat-collect.sh
Source12:   iostat-parse.sh
Source13:   iostat-zabbix.conf
BuildRequires:      gcc, gcc-c++
Requires:   gcc, gcc-c++, chkconfig
%description
Zabbix agentd 3.0.3
%pre
grep zabbix /etc/passwd > /dev/null
if [ $? != 0 ]
then useradd zabbix -M -s /sbin/nologin
fi
[ -d /etc/zabbix   ]||rm -rf /etc/zabbix
[ -d /etc/zabbix   ]||rm -rf /etc/zabbix-3.0.3
%post
sed -i "/^ServerActive=/c\ServerActive=172.30.17." /etc/zabbix/etc/zabbix_agentd.conf
sed -i "/^Server=/c\Server=172.30.17." /etc/zabbix/etc/zabbix_agentd.conf
sed -i "/Timeout=3/c\Timeout=30" /etc/zabbix/etc/zabbix_agentd.conf
sed -i "/HostMetadata=/c\HostMetadata=OPS-TMP" /etc/zabbix/etc/zabbix_agentd.conf
sed -i "/^Hostname=/c\Hostname=OPS-TMP" /etc/zabbix/etc/zabbix_agentd.conf
echo "UnsafeUserParameters=1" >>/etc/zabbix/etc/zabbix_agentd.conf
echo "EnableRemoteCommands=1" >>/etc/zabbix/etc/zabbix_agentd.conf
echo "Include=/etc/zabbix/etc/zabbix_agentd.conf.d/*.conf" >>/etc/zabbix/etc/zabbix_agentd.conf
chkconfig zabbix_agentd on
%preun
systemctl stop zabbix_agentd
%postun
userdel  zabbix
rm -rf /etc/zabbix*
%prep
%setup -q
%build
./configure --prefix=/etc/%{name}-%{version}   --enable-agent
make -j16 %{?_smp_mflags}
%install
test -L %{buildroot}/etc/%{name} && rm -f %{buildroot}/etc/%{name}
install -d %{buildroot}/etc/profile.d
make install DESTDIR=%{buildroot}
install -p -D -m 0755 %{SOURCE1}    %{buildroot}/etc/init.d/zabbix_agentd
install -p -D         %{SOURCE2}    %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/nginx_monitor.sh
install -p -D         %{SOURCE3}    %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/userparameter_nginx.conf
install -p -D         %{SOURCE4}    %{buildroot}/etc/nginx/conf.d/hostmonitor.conf
install -p -D         %{SOURCE5}    %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/process.discovery
install -p -D         %{SOURCE6}    %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/userparameter_process.conf
install -p -D         %{SOURCE7}    %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/redis_check.conf
install -p -D         %{SOURCE8}    %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/redis_cluster_check.py
install -p -D         %{SOURCE9}    %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/redis_multiport_check.py
install -p -D         %{SOURCE10}   %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/tcp_connections.sh
install -p -D         %{SOURCE11}   %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/iostat-collect.sh
install -p -D         %{SOURCE12}   %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/iostat-parse.sh
install -p -D         %{SOURCE13}       %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/iostat-zabbix.conf
echo 'export PATH=/etc/zabbix/bin:/etc/zabbix/sbin:$PATH' > %{buildroot}/etc/profile.d/%{name}.sh
ln -sf /etc/%{name}-%{version}          %{buildroot}/etc/%{name}
%files
%defattr (-,root,root,0755)
/etc/%{name}
/etc/%{name}-%{version}/*
/etc/profile.d/%{name}.sh
/etc/nginx/conf.d/hostmonitor.conf
%attr(0755,root,root) /etc/rc.d/init.d/zabbix_agentd
%changelog
%clean
rm -rf %{buildroot}

Python3+Selenium web自动化测试(五)

selenium IDE的使用说明
一、seleniumIDE界面介绍

为了方便简洁,我们就按照上图的数字标记介绍:
1、菜单栏,文件:创建、打开和保存测试案例和测试案例集。编辑:复制、粘贴、删除、撤销和选择测试案例中的所有命令。
     Action :设置脚本的录制行为。Options : 用于设置seleniunm IDE
2、用来填写被测网站的地址
3、速度控制:控制案例的执行速度
4、运行所有:运行一个测试案例集中的所有案例。
5、运行:运行当前选定的测试案例。
6、暂停/恢复:暂停和恢复测试案例执行。
7、单步:可以运行一个案例中的一行命令。
8、录制:点击之后,开始记录你对浏览器的操作。
9、案例集列表。
10、测试脚本;table标签:用表格形式展现命令及参数。source标签:用原始方式展现,默认是HTML语言格式,也可以用其他语言展示。
11、查看脚本运行通过/失败的个数。
12、当选中前命令对应参数。
13、日志/参考/UI元素/Rollup
二、录制第一个脚本
打开seleniumIDE,录制按钮默认为启动状态,在地址栏中输入要录制的地址(http://www.baidu.com)脚本录制完后,关闭录制按钮,脚本录制完成,如下图所示:

三、编辑脚本
3.1、编辑某条命令,例如修改脚本中的搜索内容,将搜索的selenium换成seleniumIDE。只需将图中的value值修改一下即可。

3.2、插入一条脚本,右键选择insert new command,根据需要,添加Command、Target、Value。

3.3、添加注释,脚本上方,右键选择insert new comment。

3.4、命令和注释位置调整,只需要通过鼠标点击拖拽即可。
3.5、定位辅助,当seleniumIDE录制脚本时,Target会生成针对当前元素的所有定位方式,可以单击target下拉选框选择元素定位方式

 
3.6、设置断点,选择一条命令,鼠标右键选择Toggle Breakpoint。

四、脚本转换
在菜单栏中,选择“文件”→“Export test Case As…”来转换我们需要的脚本格式。

录制脚本比较容易,但回放的时候可能会出现问题,需要自己根据出现的问题进行调节。本人推荐自己手写脚本,而不是录制生成。

Python3+Selenium web自动化测试(四)

selenium IDE 录制插件和firebug的安装

第一步firebug安装

之前已经安装了Firefox的浏览器(54版本),直接从浏览器的插件里面去搜索安装这两个东西
第一步安装firebug,打开Firefox浏览器,进入附件组件中

在附加组扩展中收索firebug的关键字

找到后直接安装即可

firebug的使用教程:http://www.runoob.com/firebug/firebug-tutorial.html
温馨提示firebug已经停止更新,并且只支持55版本之前的Firefox浏览器,
之后版本的浏览器使用的是这个工具https://developer.mozilla.org/en-US/docs/Tools

第一步selenium IDE 安装

同样在扩展组件中搜索selenium ide 
 
————–更新———-

根据收索结果我们找到了一个Katalon Recorder (Selenium IDE for Firefox 55+),我们使用的是54版本所以不是这个,也不是selenium IDE Button 这个东西,这个东西排序在最前面,不少人被坑!
安装完了发现只有一个按钮
往下滚动浏览器,查看更多的结果,找到一个由Jason Huggins  上传的插件

安装此插件后重启浏览器,找到工具栏上多出的此按钮,点击出现如下页面表示selenium IDE 录制插件安装成功

 
 

Linux服务器杀毒

一早到公司大家反映网速特别慢,还以为是哪个同事又忘了关迅雷了,果断登陆路由器准备封IP,结果让我震惊事情发生了,木有发现有很高上传的IP???对就是这么不科学.果断重启了各个路由器在观察,结果重启了好了!看来是路由器的问题.
但是,半个小时后,令人蛋疼的事情再次发生了,网络又开始慢的吐血,又开始了!这个时候我意识到可能是有人中了病毒.登陆路由器查找发包异常的IP,但是断了几个同事的网线后问题依旧不见好转,看来病毒伪装了IP和MAC地址,不容易找到!怎么办???
这个时候只能使用终极大招了,拔交换机!一片一片的断网,  查看问题出现在哪一片,最后断到机房的交换机后世界终于恢复清静了!
我意识到问题出在哪里了,当时开发需要在外网测试一个问题,我短暂的吧这台服务器映射到 了公网,果断断了这台服务器的网络,世界还是这么美好!
发现自己遇到的问题和这个问题类似!
博客地址:http://blog.csdn.net/yuanfeng78790/article/details/50639906
以下为原文
一、背景
晚上看到有台服务器流量跑的很高,明显和平常不一样,流量达到了800Mbps,第一感觉应该是中木马了,被人当做肉鸡了,在大量发包。
我们的服务器为了最好性能,防火墙(iptables)什么的都没有开启,但是服务器前面有物理防火墙,而且机器都是做的端口映射,也不是常见的端口,按理来说应该是满安全的,可能最近和木马有缘吧,老是让我遇到,也趁这次机会把发现过程记录一下。
二、发现并追踪处理
1、查看流量图发现问题
查看的时候网页非常卡,有的时候甚至没有响应。
wKiom1as-dyQlUCeAAFWXnyaceU258.png
2、top动态查看进程
我马上远程登录出问题的服务器,远程操作很卡,网卡出去的流量非常大,通过top发现了一个异常的进程占用资源比较高,名字不仔细看还真以为是一个Web服务进程。
wKioL1as-nOSab6eAACPx1Gw2qc060.png
3、ps命令查看进程的路径
发现这个程序文件在/etc目录下面,是个二进制程序,我拷贝了下来,放到了本文附近位置,以供大家在虚拟机上面研究,哈哈。
wKiom1as-k-TydDMAADaZz0UV1k116.png
4、结束异常进程并继续追踪
wKioL1a0Xt3Q4tCrAAAFpblEmnQ046.png
干掉进程之后,流量立刻下来了,远程也不卡顿了,难道删掉程序文件,干掉异常进程我们就认为处理完成了么?想想也肯定没那么简单的,这个是木马啊,肯定还会自己生成程序文件(果然不出我所料,在我没有搞清楚之前,后面确实又生成了)我们得继续追查。
5、查看登录记录及日志文件secure
通过命令last查看账户登录记录,一切正常。查看系统文件message并没有发现什么,但是当我查看secure文件的时候发现有些异常,反正是和认证有关的,应该是尝试连进来控制发包?
wKioL1as_jORDywFAAFogdyG4v8317.png
6、再次ps查看进程
其实第一次ps的时候就有这个问题,那时候没有发现,第二次是自习查看每个进程,自习寻找不太正常的进程,发现了一个奇怪的ps进程。
wKiom1as_uDj_cZWAAA1rhjR00k722.png
我找了一台正常的机器,查看了一下ps命令的大小,正常的大约是81KB,然后这台机器上面的ps却高达1.2M,命令文件肯定是被替换了。
wKioL1as_52wGvNHAAASrsFyr24589.png
然后进入另一个ps的目录,看到有如下几个命令,然后我有查询了一下系统的这几个命令,发现都变得很大,都达到了1.2M,这些系统命令文件肯定是都被替换了。
wKiom1as__TQk4K_AAAn0k9evMk278.png
7、更多异常文件的发现
查看定时任务文件crontab并没有发现什么一次,然后查看系统启动文件rc.local,也没有什么异常,然后进入/etc/init.d目录查看,发现比较奇怪的脚本文件DbSecuritySpt、selinux。
wKioL1atApfgw78ZAAB5n-v2zfM656.png
第一个文件可以看出他就是开机启动那个异常文件的,第二个应该和登录有关,具体我还不是很清楚,反正肯定是有问题的。
wKioL1atBB_gx4vbAAAivNZ8pRs292.png
既然和登录有关,那就找和ssh相关的,找到了下面的一个文件,是隐藏文件,这个也是木马文件,我们先记录下来,这样程序名字都和我们的服务名字很相近,就是为了迷惑我们,他们的大小都是1.2M,他们有可能是一个文件。
wKiom1atBQbz_CoYAAATGOPwJ50519.png
我有看了一下木马喜欢出现的目录/tmp,也发现了异常文件,从名字上感觉好像是监控木马程序的。
wKiom1atBnyg7i6dAACRJQNJKns664.png
想到这里,替换的命令应该很多,单靠我们去找肯定是解决不了的,我的建议最好是重装操作系统,并做好安全策略,如果不重装,我下面给一下我的方法,具体行不行有待验证。
三、木马手动清除
现在综合总结了大概步骤如下:
1、简单判断有无木马
wKioL1a0X1Oz6AO1AAAW70k_KhA559.png
2、上传如下命令到/root下
wKioL1a0X3vAPPTjAAADdBgQisU342.png
3、删除如下目录及文件
wKiom1a0X5Kw4Ra2AAAs8SOur0A089.png
4、找出异常程序并杀死
wKiom1au_5bTmDcwAADhJw0_ZTE611.png
5、删除含木马命令并重新安装(或者把上传的正常程序复制过去也行)
我自己重新安装好像不行,我是找的正常的机器复制的命令。
wKioL1a0YB2zCoZMAAAsdOvv1uE344.png
四、杀毒工具扫描
1、安装杀毒工具clamav
wKiom1a0X92waN26AAAFJMX6R60095.png
2、启动服务
wKiom1a0X_WQN_8oAAADxZKWxBk219.png
3、更新病毒库
由于ClamAV不是最新版本,所以有告警信息。可以忽略或升级最新版本。
wKiom1a0YAzDqLOlAABehHMhK3A276.png
4、扫描方法
wKioL1a0YIqRqOIXAAAOHknsIGU269.png
可以使用clamscan -h查看相应的帮助信息
5、查看日志发现
把发现的命令删掉替换正常的
wKioL1ato5WhI0v2AABTpf1Tq0I913.png
附录:Linux.BackDoor.Gates.5
经过查询资料,这个木马应该是Linux.BackDoor.Gates.5,找到一篇文件,内容具体如下:
某些用户有一种根深蒂固的观念,就是目前没有能够真正威胁Linux内核操作系统的恶意软件,然而这种观念正在面临越来越多的挑战。与4月相比,2014年5月Doctor Web公司的技术人员侦测到的Linux恶意软件数量创下了新纪录,六月份这些恶意软件名单中又增加了一系列新的Linux木马,这一新木马家族被命名为Linux.BackDoor.Gates。
在这里描述的是恶意软件家族Linux.BackDoor.Gates中的一个木马:Linux.BackDoor.Gates.5,此恶意软件结合了传统后门程序和DDoS攻击木马的功能,用于感染32位Linux版本,根据其特征可以断定,是与Linux.DnsAmp和Linux.DDoS家族木马同出于一个病毒编写者之手。新木马由两个功能模块构成:基本模块是能够执行不法分子所发指令的后门程序,第二个模块在安装过程中保存到硬盘,用于进行DDoS攻击。Linux.BackDoor.Gates.5在运行过程中收集并向不法分子转发受感染电脑的以下信息:

  • CPU核数(从/proc/cpuinfo读取)。
  • CPU速度(从/proc/cpuinfo读取)。
  • CPU使用(从/proc/stat读取)。
  • Gate’a的 IP(从/proc/net/route读取)。
  • Gate’a的MAC地址(从/proc/net/arp读取)。
  • 网络接口信息(从/proc/net/dev读取)。
  • 网络设备的MAC地址。
  • 内存(使用/proc/meminfo中的MemTotal参数)。
  • 发送和接收的数据量(从/proc/net/dev读取)。
  • 操作系统名称和版本(通过调用uname命令)。

启动后,Linux.BackDoor.Gates.5会检查其启动文件夹的路径,根据检查得到的结果实现四种行为模式。
如果后门程序的可执行文件的路径与netstat、lsof、ps工具的路径不一致,木马会伪装成守护程序在系统中启动,然后进行初始化,在初始化过程中解压配置文件。配置文件包含木马运行所必须的各种数据,如管理服务器IP地址和端口、后门程序安装参数等。
根据配置文件中的g_iGatsIsFx参数值,木马或主动连接管理服务器,或等待连接:成功安装后,后门程序会检测与其连接的站点的IP地址,之后将站点作为命令服务器。
木马在安装过程中检查文件/tmp/moni.lock,如果该文件不为空,则读取其中的数据(PID进程)并“干掉”该ID进程。然后Linux.BackDoor.Gates.5会检查系统中是否启动了DDoS模块和后门程序自有进程(如果已启动,这些进程同样会被“干掉”)。如果配置文件中设置有专门的标志g_iIsService,木马通过在文件/etc/init.d/中写入命令行#!/bin/bash\n<path_to_backdoor>将自己设为自启动,然后Linux.BackDoor.Gates.5创建下列符号链接:
 
wKioL1a0YJ_wjWEgAAALpf6u8w0676.png    如果在配置文件中设置有标志g_bDoBackdoor,木马同样会试图打开/root/.profile文件,检查其进程是否有root权限。然后后门程序将自己复制到/usr/bin/bsd-port/getty中并启动。在安装的最后阶段,Linux.BackDoor.Gates.5在文件夹/usr/bin/再次创建一个副本,命名为配置文件中设置的相应名称,并取代下列工具:
wKiom1a0YGCQ8Ss3AAAKnRyqw5o683.png
木马以此完成安装,并开始调用基本功能。
执行另外两种算法时木马同样会伪装成守护进程在被感染电脑启动,检查其组件是否通过读取相应的.lock文件启动(如果未启动,则启动组件),但在保存文件和注册自启动时使用不同的名称。
与命令服务器设置连接后,Linux.BackDoor.Gates.5接收来自服务器的配置数据和僵尸电脑需完成的命令。按照不法分子的指令,木马能够实现自动更新,对指定IP地址和端口的远程站点发起或停止DDoS攻击,执行配置数据所包含的命令或通过与指定IP地址的远程站点建立连接来执行其他命令。
此后门程序的主要DDoS攻击目标是中国的服务器,然而不法分子攻击对象也包括其他国家。下图为利用此木马进行的DDoS攻击的地理分布:
wKiom1atDxbAPpm7AAGEMXS_d8w613.png