阿里云的源yum方式安装Mongodb

1)在/etc/yum.repos.d 创建一个mongodb-org.repo 源文件

[root@qd-vpc-dev-op01 ~]$ cd /etc/yum.repos.d/
[root@qd-vpc-dev-op01 yum.repos.d]$ touch mongodb-org.repo
[root@qd-vpc-dev-op01 yum.repos.d]$ cat mongodb-org.repo
[mongodb-org]
name=MongoDB Repository
baseurl=http://mirrors.aliyun.com/mongodb/yum/redhat/7Server/mongodb-org/3.2/x86_64/
gpgcheck=0
enabled=1
根据自己的系统版本选择填写的5  6  7版本的源
2)清空缓存和更新yum源
[root@qd-vpc-dev-op01 yum.repos.d]$ yum clean all
[root@qd-vpc-dev-op01 yum.repos.d]$ yum make cache
#更新yum源
[root@qd-vpc-dev-op01 yum.repos.d]$ yum update
3) 安装MongoDB
[root@qd-vpc-dev-op01 yum.repos.d]$ yum install -y mongodb-org
4)启动MongoDB
[root@qd-vpc-dev-op01 yum.repos.d]$ service mongod start
[root@qd-vpc-dev-op01 yum.repos.d]$ chkconfig mongod on
5)配置远程访问
[root@qd-vpc-dev-op01 yum.repos.d]$cat /etc/mongod.conf|grep -v "#"|grep -v "^$"
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log
storage:
  dbPath: /var/lib/mongo
  journal:
    enabled: true
processManagement:
net:
  port: 27017
[root@qd-vpc-dev-op01 yum.repos.d]$ service mongod restart
Restarting mongod (via systemctl):                         [  OK  ]
6)打开MongoDB
[root@qd-vpc-dev-op01 yum.repos.d]$ mongo 127.0.0.1:27017
MongoDB shell version: 3.2.16
connecting to: 127.0.0.1:27017/test
Server has startup warnings: 
2017-09-30T18:27:19.681+0800 I CONTROL  [initandlisten] 
2017-09-30T18:27:19.681+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2017-09-30T18:27:19.681+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2017-09-30T18:27:19.681+0800 I CONTROL  [initandlisten] 
2017-09-30T18:27:19.681+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2017-09-30T18:27:19.681+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2017-09-30T18:27:19.681+0800 I CONTROL  [initandlisten] 
2017-09-30T18:27:19.681+0800 I CONTROL  [initandlisten] ** WARNING: soft rlimits too low. rlimits set to 4096 processes, 64000 files. Number of processes should be at least 32000 : 0.5 times number of files.
2017-09-30T18:27:19.681+0800 I CONTROL  [initandlisten]

利用阿里云pythonSDK修改RSD白名单

因为公司没有购买公网IP,每次路由器重启后IP 就会变动,阿里云服务器上的RDS需要指定白名单才能访问!为了安全性也不能开放所有的IP,每次IP变更后就需要去修改白名单不厌其烦!

参考了GiveMeFive_Y的博客源码https://blog.csdn.net/GiveMeFive_Y/article/details/78687665

修改了一个适合自己的使用的版本

第一步安装SDK

#pip install aliyun-python-sdk-rds 
#pip install aliyun-python-sdk-ecs


第二步修改参数

#!/usr/bin/env python
# coding=utf-8
import requests
import json
import os
import re
import sys
from aliyunsdkcore import client
from aliyunsdkecs.request.v20140526 import DescribeSecurityGroupAttributeRequest
from aliyunsdkecs.request.v20140526 import AuthorizeSecurityGroupRequest
from aliyunsdkecs.request.v20140526 import AuthorizeSecurityGroupEgressRequest
from aliyunsdkecs.request.v20140526 import RevokeSecurityGroupRequest
from aliyunsdkecs.request.v20140526 import RevokeSecurityGroupEgressRequest
from aliyunsdkecs.request.v20140526 import DescribeSecurityGroupsRequest

from aliyunsdkrds.request.v20140815 import ModifySecurityIpsRequest

AccessKey = “666666666” #此处填写阿里云的accesskey
AccessSecret = “7777777777” #此处填写阿里云的accesssecret
RegionId = “cn-shanghai” #此处填写RDS服务器所属地域
dbInstanceId = “rm-XXXXXX” #此处填写RDS服务器的实例ID
dbInstanceIPArrayName = “gongshi” #此处填写RDS数据库安全组的名称
dbInstanceIPArrayAttribute = “,” #此处填写RDS数据库安全组的IP的分割符
class Alis():
def __init__(self, AccessKey, AccessSecret, RegionId):
self.AccessKey = AccessKey
self.AccessSecret = AccessSecret
self.RegionId = RegionId
def client(self):
c = client.AcsClient(self.AccessKey, self.AccessSecret, self.RegionId)
return c

def describeSecurityGroupsRequest(self):
request = DescribeSecurityGroupsRequest.DescribeSecurityGroupsRequest()
request.set_accept_format(‘json’)
return request

def modifySecurityIpsRequest(self, DBInstanceId, SecurityIps, DBInstanceIPArrayName, DBInstanceIPArrayAttribute):
“””修改数据库实例白名单
“””
request = ModifySecurityIpsRequest.ModifySecurityIpsRequest()
request.set_DBInstanceId(DBInstanceId)
request.set_SecurityIps(SecurityIps)
request.set_DBInstanceIPArrayName(DBInstanceIPArrayName)
request.set_DBInstanceIPArrayAttribute(DBInstanceIPArrayAttribute)
return request

def my_ip_method_1(self):
get_ip_method = os.popen(‘curl -s ip.cn’)
get_ip_responses = get_ip_method.readlines()[0]
get_ip_pattern = re.compile(r’\d+\.\d+\.\d+\.\d+’)
get_ip_value = get_ip_pattern.findall(get_ip_responses)[0]
print get_ip_value
return get_ip_value
def my_ip_method_2(self):
get_ip_method = os.popen(‘curl -s http://ip-api.com/json’)
get_ip_responses = get_ip_method.readlines()[0]
get_ip_responses = eval(str(get_ip_responses))
get_ip_value = get_ip_responses[‘query’]
return get_ip_value
def my_ip_method_3(self):
get_ip_method = requests.get(‘http://ifconfig.co/json’).content
get_ip_value = eval(get_ip_method)
get_ip_value = get_ip_value[‘ip’]
request = get_ip_value
return request

def read_old_ip(slef):
f = open(‘./ip.txt’)
line = f.read().splitlines()
print line[0]
f.close()
return line[0]
def write_ip_txt(slef,ip):
f = open(‘./ip.txt’,’w’)
print ip
f.write(ip)
f.close()

if __name__ == ‘__main__’:
ali = Alis(AccessKey, AccessSecret, RegionId) # 阿里云后台创建
clt = ali.client()
securityIps = ali.my_ip_method_1()#根据自己情况确定使用哪个公网IP查询接口
old_ip = ali.read_old_ip()

if old_ip == securityIps:
print(‘The specified value of parameter Value is the same as old’)
else:
req = ali.modifySecurityIpsRequest(dbInstanceId, securityIps,dbInstanceIPArrayName, dbInstanceIPArrayAttribute)
res = clt.do_action_with_exception(req)
print(“修改RDS白名单%s” % res)
ip=securityIps
ali.write_ip_txt(ip)

第三步在python的目录下建立一个ip.txt的空文件夹,用于存储记录之前的历史IP

 

 

 

 

利用阿里云接口动态设置DDNS

因为公司没有购买公网IP,每次路由器重启后IP 就会变动,但是公司有很多服务器需要外网的回调进行开发调试!本来是使用的花生壳的动态域名解析,但是花生壳不争气啊,免费的动态服务,动不动就挂掉,不厌其烦!

还好阿里云的域名提供了接口更新DNS映射,并且阿里云的DNS修改后生效非常的快!

本着重来不干重复造轮子的事情,通过收索找到了一个可以动态通过接口修改IP的python源码  ,github地址https://github.com/terencechuen/terence_proj/tree/master/aliyun_ddns

我的centos服务器使用的是python2的环境,使用的下面这个版本的python代码

将此代码下载到linux 服务器,然后编辑源代码

# -*- coding: UTF-8 -*-

import json
import os
import re
import sys
from datetime import datetime

import requests
from aliyunsdkalidns.request.v20150109 import UpdateDomainRecordRequest, DescribeDomainRecordsRequest, \
DescribeDomainRecordInfoRequest
from aliyunsdkcore import client

access_key_id = “”
access_Key_secret = “”

# 请填写你的账号ID
account_id = “”

# 如果填写yes,则运行程序后仅显示域名信息,并不会更新记录,用于获取解析记录ID。
# 如果填写no,则运行程序后不显示域名信息,仅更新记录。
i_dont_know_record_id = ‘no’

# 请填写你的一级域名
rc_domain = ‘baidu.com’

# 请填写你的解析记录
rc_rr = ‘vpn’

# 请填写你的记录类型,DDNS请填写A,表示A记录
rc_type = ‘A’

# 请填写解析记录ID
rc_record_id = ‘3825227609856000’

# 请填写解析有效生存时间TTL,单位:秒
rc_ttl = ‘600’

# 请填写返还内容格式,json,xml
rc_format = ‘json’
def my_ip_method_1():
get_ip_method = os.popen(‘curl -s ip.cn’)
get_ip_responses = get_ip_method.readlines()[0]
get_ip_pattern = re.compile(r’\d+\.\d+\.\d+\.\d+’)
get_ip_value = get_ip_pattern.findall(get_ip_responses)[0]
return get_ip_value
def my_ip_method_2():
get_ip_method = os.popen(‘curl -s http://ip-api.com/json’)
get_ip_responses = get_ip_method.readlines()[0]
get_ip_responses = eval(str(get_ip_responses))
get_ip_value = get_ip_responses[‘query’]
return get_ip_value
def my_ip_method_3():
get_ip_method = requests.get(‘http://ifconfig.co/json’).content
get_ip_value = eval(get_ip_method)
get_ip_value = get_ip_value[‘ip’]
return get_ip_value
def check_records(dns_domain):
clt = client.AcsClient(access_key_id, access_Key_secret, ‘cn-hangzhou’)
request = DescribeDomainRecordsRequest.DescribeDomainRecordsRequest()
request.set_DomainName(dns_domain)
request.set_accept_format(rc_format)
result = clt.do_action_with_exception(request)
result = result.decode()
result_dict = json.JSONDecoder().decode(result)
result_list = result_dict[‘DomainRecords’][‘Record’]
for j in result_list:
print(‘Subdomain:’ + j[‘RR’].encode() + ‘ ‘ + ‘| RecordId:’ + j[‘RecordId’].encode())
return
def old_ip():
clt = client.AcsClient(access_key_id, access_Key_secret, ‘cn-hangzhou’)
request = DescribeDomainRecordInfoRequest.DescribeDomainRecordInfoRequest()
request.set_RecordId(rc_record_id)
request.set_accept_format(rc_format)
result = clt.do_action_with_exception(request).decode()
result = json.JSONDecoder().decode(result)
result = result[‘Value’]
return result
def update_dns(dns_rr, dns_type, dns_value, dns_record_id, dns_ttl, dns_format):
clt = client.AcsClient(access_key_id, access_Key_secret, ‘cn-hangzhou’)
request = UpdateDomainRecordRequest.UpdateDomainRecordRequest()
request.set_RR(dns_rr)
request.set_Type(dns_type)
request.set_Value(dns_value)
request.set_RecordId(dns_record_id)
request.set_TTL(dns_ttl)
request.set_accept_format(dns_format)
result = clt.do_action_with_exception(request)
return result
def write_to_file():
time_now = datetime.now().strftime(‘%Y-%m-%d %H:%M:%S’)
current_script_path = sys.path[1]
print current_script_path
log_file = ‘/root/ddns’ + ‘/’ + ‘aliyun_ddns_log.txt’
write = open(log_file, ‘a’)
write.write(time_now + ‘ ‘ + str(rc_value) + ‘\n’)
write.close()
return
if i_dont_know_record_id == ‘yes’:
check_records(rc_domain)
elif i_dont_know_record_id == ‘no’:
rc_value = my_ip_method_1()
print rc_value
rc_value_old = old_ip()
if rc_value_old == rc_value:
print(‘The specified value of parameter Value is the same as old’)
else:
print(update_dns(rc_rr, rc_type, rc_value, rc_record_id, rc_ttl, rc_format))
write_to_file()

 

执行改脚本

[root@localhost ddns]# python AliyunDDNS_NonSDK.py
[#180328-15:19] DNS Record was updated from [1797x1q502.imwork.net] to [171.217.104.245].

 

 

 

使用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提供的提示,我选择在启动时不显示提示。

关闭提示