王一川的博客

iipirate


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 日程表

  • 站点地图

各种验证邮件地址的正则表达式

发表于 2017-11-07 | 分类于 Shell
用正则表达式验证邮件地址似乎是一件简单的事情,但是如果要完美的验证一个合规的邮件地址,其实也许很复杂。邮件地址的规范来自于 RFC 5322 。
聊一聊 各种验证邮件地址的正则表达式聊一聊 各种验证邮件地址的正则表达式邮件地址的规范来自于 RFC 5322 。有一个网站 emailregex.com 专门列出各种编程语言下的验证邮件地址的正则表达式,其中很多正则表达式都是我听说过而从未见过的复杂——我想说,做这个网站的程序员是被邮件验证这件事伤害了多深啊!

其实,在产品环境中,一般来说并不需要这么复杂的正则表达式来做到99.99%正确。一般来说,从执行效率和测试覆盖率来说,只需要一个简单的版本即可:

/^[A-Z0-9._%+-]+@[A-Z0-9.-]+/.[A-Z]{2,4}$/i

那么下面我们来看看这些更严谨、更复杂的正则表达式吧:
验证邮件地址的通用正则表达式(符合 RFC 5322 标准)

(?:[a-z0-9!#$%&’+/=?^_`{|}~-]+(?:/.[a-z0-9!#$%&’+/=?^_`{|}~-]+)|”(?:[/x01-/x08/x0b/x0c/x0e-/x1f/x21/x23-/x5b/x5d-/x7f]|//[/x01-/x09/x0b/x0c/x0e-/x7f])“)@(?:(?:a-z0-9?/.)+a-z0-9?|/[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[/x01-/x08/x0b/x0c/x0e-/x1f/x21-/x5a/x53-/x7f]|//[/x01-/x09/x0b/x0c/x0e-/x7f])+)/])

由于各种语言对正则表达式的支持不同、语法差异和覆盖率不同,所以,不同语言里面的正则表达式也不同:

Python

这个是个简单的版本:

r”(^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+/.[a-zA-Z0-9-.]+$)”

Javascript

这个有点复杂了:

/^[-a-z0-9~!$%^&_=+}{/‘?]+(/.[-a-z0-9~!$%^&_=+}{/‘?]+)@([a-z0-9_][-a-z0-9_](/.[-a-z0-9_]+)*/.(aero|arpa|biz|com|coop|edu|gov|info|int|mil|museum|name|net|org|pro|travel|mobi|[a-z][a-z])|([0-9]{1,3}/.[0-9]{1,3}/.[0-9]{1,3}/.[0-9]{1,3}))(:[0-9]{1,5})?$/i

Swift

[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+//.[A-Za-z]{2,6}

PHP

PHP 的这个版本就更复杂了,覆盖率就更大一些:

/^(?!(?:(?:/x22?/x5C[/x00-/x7E]/x22?)|(?:/x22?[^/x5C/x22]/x22?)){255,})(?!(?:(?:/x22?/x5C[/x00-/x7E]/x22?)|(?:/x22?[^/x5C/x22]/x22?)){65,}@)(?:(?:[/x21/x23-/x27/x2A/x2B/x2D/x2F-/x39/x3D/x3F/x5E-/x7E]+)|(?:/x22(?:[/x01-/x08/x0B/x0C/x0E-/x1F/x21/x23-/x5B/x5D-/x7F]|(?:/x5C[/x00-/x7F]))/x22))(?:/.(?:(?:[/x21/x23-/x27/x2A/x2B/x2D/x2F-/x39/x3D/x3F/x5E-/x7E]+)|(?:/x22(?:[/x01-/x08/x0B/x0C/x0E-/x1F/x21/x23-/x5B/x5D-/x7F]|(?:/x5C[/x00-/x7F]))/x22)))@(?:(?:(?!.[^.]{64,})(?:(?:(?:xn–)?[a-z0-9]+(?:-[a-z0-9]+)/.){1,126}){1,}(?:(?:[a-z][a-z0-9])|(?:(?:xn–)[a-z0-9]+))(?:-[a-z0-9]+))|(?:/[(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){7})|(?:(?!(?:.[a-f0-9][:/]]){7,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?)))|(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){5}:)|(?:(?!(?:.*[a-f0-9]:){5,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3}:)?)))?(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))(?:/.(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))){3}))/]))$/iD

Perl / Ruby

对与 PHP 的版本,Perl 和 Ruby 表示不服,可以更严谨:

(?:(?:/r/n)?[ /t])(?:(?:(?:[^()<>@,;://“./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/[“()<>@,;://“./[/]]))|”(?:[^/“/r//]|//.|(?:(?:/r/n)?[ /t]))“(?:(?:/r/n)?[ /t]))(?:/.(?:(?:/r/n)?[ /t])(?:[^()<>@,;://“./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/[“()<>@,;://“./[/]]))|”(?:[^/“/r//]|//.|(?:(?:/r/n)?[/t]))“(?:(?:/r/n)?[ /t])))@(?:(?:/r/n)?[ /t])(?:[^()<>@,;://“./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/[“()<>@,;://“./[/]]))|/([^/[/]/r//]|//.)*/?[ /t]))(?:/.(?:(?:/r/n)?[ /t])(?:[^()<>@,;://“./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/[“()<>@,;://“./[/]]))|/([^/[/]/r//]|//.)*/?[ /t])))|(?:[^()<>@,;://“./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/[“()<>@,;://“./[/]]))|”(?:[^/“/r//]|//.|(?:(?:/r/n)?[ /t]))“(?:(?:/r/n)?[ /t]))/<(?:(?:/r/n)?[ /t])(?:@(?:[^()<>@,;://“./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/[“()<>@,;://“./[/]]))|/([^/[/]/r//]|//.)*/?[/t]))(?:/.(?:(?:/r/n)?[ /t])(?:[^()<>@,;://“./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/[“()<>@,;://“./[/]]))|/([^/[/]/r//]|//.)*/?[ /t])))(?:,@(?:(?:/r/n)?[ /t])(?:[^()<>@,;://“./[/] /000-/031]+(?:(?:(?:/r/n)?[/t])+|/Z|(?=[/[“()<>@,;://“./[/]]))|/[([^/[/]/r//]|//.)/](?:(?:/r/n)?[ /t]))(?:/.(?:(?:/r/n)?[ /t])(?:[^()<>@,;://“./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/[“()<>@,;://“./[/]]))|/([^/[/]/r//]|//.)*/?[ /t])))):(?:(?:/r/n)?[ /t]))?(?:[^()<>@,;://“./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/[“()<>@,;://“./[/]]))|”(?:[^/“/r//]|//.|(?:(?:/r/n)?[ /t]))“(?:(?:/r/n)?[ /t]))(?:/.(?:(?:/r/n)?[ /t])(?:[^()<>@,;://“./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/[“()<>@,;://“./[/]]))|”(?:[^/“/r//]|//.|(?:(?:/r/n)?[ /t]))“(?:(?:/r/n)?[ /t])))@(?:(?:/r/n)?[ /t])(?:[^()<>@,;://“./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/[“()<>@,;://“./[/]]))|/[([^/[/]/r//]|//.)/](?:(?:/r/n)?[ /t]))(?:/.(?:(?:/r/n)?[ /t])(?:[^()<>@,;://“./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/[“()<>@,;://“./[/]]))|/([^/[/]/r//]|//.)*/?[ /t])))/>(?:(?:/r/n)?[ /t]))|(?:[^()<>@,;://“./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/[“()<>@,;://“./[/]]))|”(?:[^/“/r//]|//.|(?:(?:/r/n)?[ /t]))“(?:(?:/r/n)?[ /t])):(?:(?:/r/n)?[ /t])(?:(?:(?:[^()<>@,;://“./[/]/000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/[“()<>@,;://“./[/]]))|”(?:[^/“/r//]|//.|(?:(?:/r/n)?[ /t]))“(?:(?:/r/n)?[ /t]))(?:/.(?:(?:/r/n)?[ /t])(?:[^()<>@,;://“./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/[“()<>@,;://“./[/]]))|”(?:[^/“/r//]|//.|(?:(?:/r/n)?[ /t]))“(?:(?:/r/n)?[ /t])))@(?:(?:/r/n)?[ /t])(?:[^()<>@,;://“./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/[“()<>@,;://“./[/]]))|/([^/[/]/r//]|//.)*/?[ /t]))(?:/.(?:(?:/r/n)?[ /t])(?:[^()<>@,;://“./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/[“()<>@,;://“./[/]]))|/([^/[/]/r//]|//.)*/?[ /t])))|(?:[^()<>@,;://“./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/[“()<>@,;://“./[/]]))|”(?:[^/“/r//]|//.|(?:(?:/r/n)?[ /t]))“(?:(?:/r/n)?[ /t]))/<(?:(?:/r/n)?[ /t])(?:@(?:[^()<>@,;://“./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/[“()<>@,;://“./[/]]))|/([^/[/]/r//]|//.)*/?[ /t]))(?:/.(?:(?:/r/n)?[ /t])(?:[^()<>@,;://“./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/[“()<>@,;://“./[/]]))|/([^/[/]/r//]|//.)*/?[ /t])))(?:,@(?:(?:/r/n)?[ /t])(?:[^()<>@,;://“./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/[“()<>@,;://“./[/]]))|/[([^/[/]/r//]|//.)/](?:(?:/r/n)?[ /t]))(?:/.(?:(?:/r/n)?[ /t])(?:[^()<>@,;://“./[/]/000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/[“()<>@,;://“./[/]]))|/([^/[/]/r//]|//.)*/?[ /t])))):(?:(?:/r/n)?[ /t]))?(?:[^()<>@,;://“./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/[“()<>@,;://“./[/]]))|”(?:[^/“/r//]|//.|(?:(?:/r/n)?[ /t]))“(?:(?:/r/n)?[ /t]))(?:/.(?:(?:/r/n)?[ /t])(?:[^()<>@,;://“./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/[“()<>@,;://“./[/]]))|”(?:[^/“/r//]|//.|(?:(?:/r/n)?[ /t]))“(?:(?:/r/n)?[ /t])))@(?:(?:/r/n)?[ /t])(?:[^()<>@,;://“./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/[“()<>@,;://“./[/]]))|/[([^/[/]/r//]|//.)/](?:(?:/r/n)?[ /t]))(?:/.(?:(?:/r/n)?[ /t])(?:[^()<>@,;://“./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/[“()<>@,;://“./[/]]))|/([^/[/]/r//]|//.)*/?[ /t])))/>(?:(?:/r/n)?[ /t]))(?:,/s(?:(?:[^()<>@,;://“./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/[“()<>@,;://“./[/]]))|”(?:[^/“/r//]|//.|(?:(?:/r/n)?[ /t]))“(?:(?:/r/n)?[ /t]))(?:/.(?:(?:/r/n)?[ /t])(?:[^()<>@,;://“./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/[“()<>@,;://“./[/]]))|”(?:[^/“/r//]|//.|(?:(?:/r/n)?[ /t]))“(?:(?:/r/n)?[ /t])))@(?:(?:/r/n)?[ /t])(?:[^()<>@,;://“./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/[“()<>@,;://“./[/]]))|/[([^/[/]/r//]|//.)/](?:(?:/r/n)?[ /t]))(?:/.(?:(?:/r/n)?[ /t])(?:[^()<>@,;://“./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/[“()<>@,;://“./[/]]))|/([^/[/]/r//]|//.)*/?[ /t])))|(?:[^()<>@,;://“./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/[“()<>@,;://“./[/]]))|”(?:[^/“/r//]|//.|(?:(?:/r/n)?[ /t]))“(?:(?:/r/n)?[ /t]))/<(?:(?:/r/n)?[ /t])(?:@(?:[^()<>@,;://“./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/[“()<>@,;://“./[/]]))|/([^/[/]/r//]|//.)*/?[ /t]))(?:/.(?:(?:/r/n)?[ /t])(?:[^()<>@,;://“./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/[“()<>@,;://“./[/]]))|/([^/[/]/r//]|//.)*/?[ /t])))(?:,@(?:(?:/r/n)?[/t])(?:[^()<>@,;://“./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/[“()<>@,;://“./[/]]))|/[([^/[/]/r//]|//.)/](?:(?:/r/n)?[ /t]))(?:/.(?:(?:/r/n)?[ /t])(?:[^()<>@,;://“./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/[“()<>@,;://“./[/]]))|/([^/[/]/r//]|//.)*/?[ /t])))):(?:(?:/r/n)?[ /t]))?(?:[^()<>@,;://“./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/[“()<>@,;://“./[/]]))|”(?:[^/“/r//]|//.|(?:(?:/r/n)?[ /t]))“(?:(?:/r/n)?[ /t]))(?:/.(?:(?:/r/n)?[ /t])(?:[^()<>@,;://“./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/[“()<>@,;://“./[/]]))|”(?:[^/“/r//]|//.|(?:(?:/r/n)?[ /t]))“(?:(?:/r/n)?[ /t])))@(?:(?:/r/n)?[ /t])(?:[^()<>@,;://“./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/[“()<>@,;://“./[/]]))|/[([^/[/]/r//]|//.)/](?:(?:/r/n)?[ /t]))(?:/.(?:(?:/r/n)?[ /t])(?:[^()<>@,;://“./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/[“()<>@,;://“./[/]]))|/([^/[/]/r//]|//.)*/?[ /t])))/>(?:(?:/r/n)?[ /t]))))?;/s

Perl 5.10 及以后版本

上面的版本,嗯,我可以说是天书吗?反正我是没有解读的想法了。当然,新版本的 Perl 语言还有一个更易读的版本(你是说真的么?)

/(?(DEFINE)
(?

(?&mailbox) | (?&group))
(? (?&name_addr) | (?&addr_spec))
(? (?&display_name)? (?&angle_addr))
(? (?&CFWS)? < (?&addr_spec) > (?&CFWS)?)
(? (?&display_name) : (?:(?&mailbox_list) | (?&CFWS))? ;
(?&CFWS)?)
(? (?&phrase))
(? (?&mailbox) (?: , (?&mailbox))*)

(? (?&local_part) /@ (?&domain))
(? (?&dot_atom) | (?”ed_string))
(? (?&dot_atom) | (?&domain_literal))
(? (?&CFWS)? /[ (?: (?&FWS)? (?&dcontent))* (?&FWS)?
/] (?&CFWS)?)
(? (?&dtext) | (?”ed_pair))
(? (?&NO_WS_CTL) | [/x21-/x5a/x5e-/x7e])

(? (?&ALPHA) | (?&DIGIT) | [!#/$%&’+-/=?^_`{|}~])
(? (?&CFWS)? (?&atext)+ (?&CFWS)?)
(? (?&CFWS)? (?&dot_atom_text) (?&CFWS)?)
(? (?&atext)+ (?: /. (?&atext)+)
)

(? [/x01-/x09/x0b/x0c/x0e-/x7f])
(? // (?&text))

(? (?&NO_WS_CTL) | [/x21/x23-/x5b/x5d-/x7e])
(? (?&qtext) | (?”ed_pair))
(? (?&CFWS)? (?&DQUOTE) (?:(?&FWS)? (?&qcontent))*
(?&FWS)? (?&DQUOTE) (?&CFWS)?)

(? (?&atom) | (?”ed_string))
(? (?&word)+)

#Folding white space
(? (?: (?&WSP) (?&CRLF))? (?&WSP)+)
(? (?&NO_WS_CTL) | [/x21-/x27/x2a-/x5b/x5d-/x7e])
(? (?&ctext) | (?”ed_pair) | (?&comment))
(? /( (?: (?&FWS)? (?&ccontent))
(?&FWS)? /) )
(? (?: (?&FWS)? (?&comment))*
(?: (?:(?&FWS)? (?&comment)) | (?&FWS)))

#No whitespace control
(? [/x01-/x08/x0b/x0c/x0e-/x1f/x7f])

(? [A-Za-z])
(? [0-9])
(? /x0d /x0a)
(? “)
(? [/x20/x09])
)

(?&address)/x

Ruby (简单版)

Ruby 表示,其实人家还有个简单版本:

//A([/w+/-].?)+@[a-z/d/-]+(/.[a-z]+)*/.[a-z]+/z/i

.NET

这样的版本谁没有啊——.NET 说:

^/w+([-+.’]/w+)@/w+([-.]/w+)/./w+([-.]/w+)*$

grep 命令

用 grep 命令在文件中查找邮件地址,我想你不会写个若干行的正则表达式吧,意思一下就行了:

$ grep -E -o “/b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+/.[A-Za-z]{2,6}/b” filename.txt

SQL Server

在 SQL Server 中也是可以用正则表达式的,不过这个代码片段应该是来自某个产品环境中的,所以,还体贴的照顾了那些把邮件地址写错的人:

select email
from table_name where
patindex (‘%[ &’’,”:;!+=//()<>]%’, email) > 0 – Invalid characters
or patindex (‘[@.-_]%’, email) > 0 – Valid but cannot be starting character
or patindex (‘%[@.-_]’, email) > 0 – Valid but cannot be ending character
or email not like ‘%@%.%’ – Must contain at least one @ and one .
or email like ‘%..%’ – Cannot have two periods in a row
or email like ‘%@%@%’ – Cannot have two @ anywhere
or email like ‘%.@%’ or email like ‘%@.%’ – Cannot have @ and . next to each other
or email like ‘%.cm’ or email like ‘%.co’ – Camaroon or Colombia? Typos.
or email like ‘%.or’ or email like ‘%.ne’ – Missing last letter

Oracle PL/SQL

这个是不是有点偷懒?尤其是在那些“复杂”的正则表达式之后:

SELECT email
FROM table_name
WHERE REGEXP_LIKE (email, ‘[A-Z0-9._%-]+@[A-Z0-9._%-]+/.[A-Z]{2,4}’);

MySQL

好吧,看来最后也一样懒:

SELECT * FROM users WHERE email NOT REGEXP ‘^[A-Z0-9._%-]+@[A-Z0-9.-]+/.[A-Z]{2,4}$’;

那么,你有没有关于验证邮件地址的正则表达式分享给大家?

iptables命令使用详解

发表于 2017-10-31 | 分类于 linux

iptables的主要功能是实现对网络数据包进出设备及转发的控制。当数据包需要进入设备、从设备中流出或者经该设备转发、路由时,都可以使用iptables进行控制。

环境

操作系统:CentOS7.3

ip地址:172.16.55.7

1.iptables中的四表五链及堵通策略

A.四表是指,iptables的功能filter, nat, mangle, raw.

    filter, 控制数据包是否允许进出及转发(INPUT、OUTPUT、FORWARD),可以控制的链路有input, forward, output

    nat, 控制数据包中地址转换,可以控制的链路有prerouting, input, output, postrouting

    mangle,修改数据包中的原数据,可以控制的链路有prerouting, input, forward, output, postrouting

    raw,控制nat表中连接追踪机制的启用状况,可以控制的链路有prerouting, output

  注:在centos7中,还有security表,不过这里不作介绍

B.五链是指内核中控制网络的NetFilter定义的五个规则链,分别为

    PREROUTING, 路由前

    INPUT, 数据包流入口

    FORWARD, 转发管卡

    OUTPUT, 数据包出口

    POSTROUTING, 路由后

C.堵通策略是指对数据包所做的操作,一般有两种操作——“通(ACCEPT)”、“堵(DROP)”,还有一种操作很常见REJECT.

谈谈REJECT和DROP之间的区别,Ming写了一封信,向Rose示爱。Rose如果不愿意接受,她可以不回应Ming,这个时候Ming不确定Rose是否接到了信;Rose也可以同样写一封信,在信中明确地拒绝Ming。前一种操作就如同执行了DROP操作,而后一种操作就如同REJECT操作。

2.iptables命令的语法规则

iptables [-t table] COMMAND [chain] CRETIRIA -j ACTION
  -t table,是指操作的表,filter、nat、mangle或raw, 默认使用filter

  COMMAND,子命令,定义对规则的管理

  chain, 指明链路

  CRETIRIA, 匹配的条件或标准

  ACTION,操作动作

  例如,不允许10.8.0.0/16网络对80/tcp端口进行访问,

iptables -A INPUT -s 10.8.0.0/16 -d 172.16.55.7 -p tcp –dport 80 -j DROP
  查看iptables列表

iptables -nL

3.链管理

  -N, –new-chain chain:新建一个自定义的规则链;

  -X, –delete-chain [chain]:删除用户自定义的引用计数为0的空链;

  -F, –flush [chain]:清空指定的规则链上的规则;

  -E, –rename-chain old-chain new-chain:重命名链;

  -Z, –zero [chain [rulenum]]:置零计数器;  

  -P, –policy chain target, 设置链路的默认策略

4.规则管理

  -A, –append chain rule-specification:追加新规则于指定链的尾部;

  -I, –insert chain [rulenum] rule-specification:插入新规则于指定链的指定位置,默认为首部;

  -R, –replace chain rulenum rule-specification:替换指定的规则为新的规则;

  -D, –delete chain rulenum:根据规则编号删除规则;

5.查看规则 

  -L, –list [chain]:列出规则;

  -v, –verbose:详细信息;

    -vv, -vvv 更加详细的信息

  -n, –numeric:数字格式显示主机地址和端口号;

  -x, –exact:显示计数器的精确值;

  –line-numbers:列出规则时,显示其在链上的相应的编号;

  -S, –list-rules [chain]:显示指定链的所有规则;

  查看规则的一般内容:

  

6.匹配条件

匹配条件包括通用匹配条件和扩展匹配条件。

通用匹配条件是指针对源地址、目标地址的匹配,包括单一源IP、单一源端口、单一目标IP、单一目标端口、数据包流经的网卡以及协议。

扩展匹配条件指通用匹配之外的匹配条件。

6.1通用匹配条件

[!] -s, –source address[/mask][,…]:检查报文的源IP地址是否符合此处指定的范围,或是否等于此处给定的地址;

[!] -d, –destination address[/mask][,…]:检查报文的目标IP地址是否符合此处指定的范围,或是否等于此处给定的地址;

[!] -p, –protocol protocol:匹配报文中的协议,可用值tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh 或者 “all”, 亦可以数字格式指明协议;
[!] -i, –in-interface name:限定报文仅能够从指定的接口流入;only for packets entering the INPUT, FORWARD and PREROUTING chains.

[!] -o, –out-interface name:限定报文仅能够从指定的接口流出;for packets entering the FORWARD, OUTPUT and POSTROUTING chains.

6.2扩展匹配条件

隐含扩展匹配条件
-p tcp:可直接使用tcp扩展模块的专用选项;
  [!] –source-port,–sport port[:port] 匹配报文源端口;可以给出多个端口,但只能是连续的端口范围 ;

  [!] –destination-port,–dport port[:port] 匹配报文目标端口;可以给出多个端口,但只能是连续的端口范围 ;

  [!] –tcp-flags mask comp 匹配报文中的tcp协议的标志位;Flags are: SYN ACK FIN RST URG PSH ALL NONE;
    mask:要检查的FLAGS list,以逗号分隔;
    comp:在mask给定的诸多的FLAGS中,其值必须为1的FLAGS列表,余下的其值必须为0;

  [!] –syn: –tcp-flags SYN,ACK,FIN,RST SYN

-p udp:可直接使用udp协议扩展模块的专用选项:

  [!] –source-port,–sport port[:port]

  [!] –destination-port,–dport port[:port]

-p icmp
  [!] –icmp-type {type[/code]|typename}

    0/0:echo reply

    8/0:echo request

显式扩展匹配条件
  必须用-m option选项指定扩展匹配的类型,常见的有以下几种,

1、multiport

以离散或连续的 方式定义多端口匹配条件,最多15个;

  [!] –source-ports,–sports port[,port|,port:port]…:指定多个源端口;

  [!] –destination-ports,–dports port[,port|,port:port]…:指定多个目标端口;

iptables -I INPUT -d 172.16.0.7 -p tcp -m multiport –dports 22,80,139,445,3306 -j ACCEPT

2、iprange

以连续地址块的方式来指明多IP地址匹配条件;

  [!] –src-range from[-to]

  [!] –dst-range from[-to]

iptables -I INPUT -d 172.16.0.7 -p tcp -m multiport –dports 22,80,139,445,3306 -m iprange –src-range 172.16.0.61-172.16.0.70 -j REJECT

3、time

匹配数据包到达的时间

  –timestart hh:mm[:ss]

  –timestop hh:mm[:ss]

  [!] –weekdays day[,day…]

  [!] –monthdays day[,day…]

  –datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]

  –datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]

  –kerneltz:使用内核配置的时区而非默认的UTC;

4、string

匹配数据包中的字符

  –algo {bm|kmp}

  [!] –string pattern

  [!] –hex-string pattern

  –from offset

  –to offset

~]# iptables -I OUTPUT -m string –algo bm –string “gay” -j REJECT

5、connlimit

用于限制同一IP可建立的连接数目

  –connlimit-upto n

  –connlimit-above n

~]# iptables -I INPUT -d 172.16.0.7 -p tcp –syn –dport 22 -m connlimit –connlimit-above 2 -j REJECT

6、limit

限制收发数据包的速率

  –limit rate[/second|/minute|/hour|/day]

  –limit-burst number

~]# iptables -I OUTPUT -s 172.16.0.7 -p icmp –icmp-type 0 -j ACCEPT

7、state

限制收发包的状态

  [!] –state state

  INVALID, ESTABLISHED, NEW, RELATED or UNTRACKED.

  NEW: 新连接请求;

  ESTABLISHED:已建立的连接;

  INVALID:无法识别的连接;

  RELATED:相关联的连接,当前连接是一个新请求,但附属于某个已存在的连接;

  UNTRACKED:未追踪的连接;

state扩展:

内核模块装载:
  nf_conntrack
  nf_conntrack_ipv4

手动装载:
  nf_conntrack_ftp

追踪到的连接:
  /proc/net/nf_conntrack

调整可记录的连接数量最大值:
  /proc/sys/net/nf_conntrack_max

超时时长:
  /proc/sys/net/netfilter/timeout

磁盘管理命令

发表于 2017-10-30 | 分类于 linux

Linux有着管理各种存储设备的强大能力。Linux把所有磁盘都当作文件管理,从而简化我们对其进行的读写等操作。
每个硬盘的分区命名:
IDE硬盘(以/dev/hda为例)为:
/dev/hda1
/dev/hda2
/dev/hda3

SATA或其他硬盘(以/dev/sda为例)为:
    /dev/sda1
    /dev/sda2
    /dev/sda3

磁盘属于块设备,我们可以使用ls命令查看下服务器上所有已安装的磁盘:

1
2
3
4
5
6
[root@linux ~]# ls -l /dev | grep "[[:space:]][h|s]" | grep "^b"
brw-rw----. 1 root disk 8, 0 Dec 3 11:10 sda
brw-rw----. 1 root disk 8, 1 Dec 3 11:10 sda1
brw-rw----. 1 root disk 8, 2 Dec 3 11:10 sda2
brw-rw----. 1 root disk 8, 16 Dec 3 11:10 sdb
brw-rw----. 1 root cdrom 11, 0 Dec 3 11:10 sr0

注:命令中的两个grep命令用来过滤出磁盘所在的行。

说到分区,我们不得不提下MBR,MBR是mater boot recoder的简写,其存在于硬盘的0磁道0扇区,占据512B的空间(每个扇区也就512B),这512B的空间又细分如下:
446B:存放boot loader,几开机引导程序;
64B:存放分区信息,每条分区信息占16B的空间,所以其最多存储4条分区信息,
所以每个硬盘最多能分出4个主分区或3个主分区加一个扩展分区;
剩下的2B空间:是此MBR的有效性标识。

通过上面的信息我们知道每个硬盘最多能分出4个主分区或3个主分区加一个扩展分区,那是不是每个硬盘最多只能分4个分区呢?
非也,我们可以在这四个分区中留出一个做为扩展分区,扩展分区又可以细分出多个逻辑分区。扩展分区中的逻辑分区编号只能从5开始,比如我有一块硬盘,划分出2个主分区和1个扩展分区(主分区+扩展分区数量不能超过4个),扩展分区下又有两个逻辑分区,其变号为:

1
2
3
4
5
6
Device Boot Start End Blocks Id System
/dev/sdb1 1 262 2104483+ 83 Linux
/dev/sdb2 263 524 2104515 83 Linux
/dev/sdb3 525 1830 10490445 5 Extended
/dev/sdb5 525 1178 5253223+ 83 Linux
/dev/sdb6 1179 1830 5237158+ 83 Linux

但是分区是怎么划分出来的呢?
是通过fdisk命令:
使用方法:fdisk /dev/DEVICE_NAME 或者 fdisk -l
直接在shell中输入fdisk -l只会把所有的硬盘和分区信息输出到屏幕,可以自行测试。
对于fdisk /dev/DEVICE
如:

1
[root@linux ~]# fdisk /dev/sdb

会进入/dev/sdb的操作界面,直接在提示符处输入对应的命令按提示操作即可,当不知道怎么操作时可以输入m查看帮助:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Command (m for help): m
Command action
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
d delete a partition
l list known partition types
m print this menu
n add a new partition
o create a new empty DOS partition table
p print the partition table
q quit without saving changes
s create a new empty Sun disklabel
t change a partition's system id
u change display/entry units
v verify the partition table
w write table to disk and exit
x extra functionality (experts only)

常用的输入:
p: 显示已有分区
n: 创建
d: 删除
w: 保存
q: 退出
l: 列出可用的分区类型,类型很重要,比如swap只能用82类型的分区;
创建一个分区:

1
2
3
4
5
6
7
8
9
Command (m for help): n <---n表示创建新分区
Command action
e extended
p primary partition (1-4)
p <---表示创建主分区,e表示创建扩展分区
Partition number (1-4): 1 <---输入主分区号,第一个则输入1
First cylinder (1-2610, default 1): <---输入分区开始的磁柱,直接回车按默认即可
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-2610, default 2610): +2G <---输入结束的磁柱,也可输入大小,比+2G或者+2000M。回车即创建完成。

创建扩展分区与创建主分区步骤相同;

在扩展分区下创建一个逻辑分区:

1
2
3
4
5
6
7
8
Command (m for help): n
Command action
l logical (5 or over) <---注意逻辑分区号是从5开始的。
p primary partition (1-4)
l <---l(L的小写)表示逻辑分区
First cylinder (525-1830, default 525):
Using default value 525
Last cylinder, +cylinders or +size{K,M,G} (525-1830, default 1830): +5G

创建逻辑分区与创建主分区过程基本相同,只是创建逻辑分区不需要输入分区号。
切记,操作完成退出前别忘了输入w执行保存分区信息,否则分区失败,也就是没有分区;
最后输入q,退出fdisk命令。
更多fdisk用法请自行man。

分区完成可以在shell中使用 fdisk -l 查看或者 cat /proc/partitions 查看。
若 cat /proc/partitions 后没有显示新建的分区,可以使用partx命令让内核重新读取分区信息:
partx -a /dev/sdb;
-a表示add;
更多partx用法请自行man。

创建分区后还是不能立即使用的,因为还要通过格式化和挂载才能使用,我们就先来看下怎么格式化分区吧;
格式化就是把分区格式化成特定的文件系统;
Linux支持的文件系统有:ext2, ext3, ext4, xfs, btrfs, reiserfs, jfs, swap;
其中ext2和VFAT为非日志文件系统,其余全部为日志文件系统;日志文件系统较为先进,稳定性较好。
还有两个特殊的:
swap内存交换分区,用于存放内存交换页面文件;
Linux的虚拟文件系统: VFS,用于虚拟所有的文件系统,给用户提供统一的接口。
为什么需要文件系统呢?
文件系统是为方便操作系统对分区的管理而对空间进行的一系列规划整理,打个比方,你要做一个书架,你是不是要好好的划分下书架的空间以便于更好管理书架并放置更多的书呢?
ext系列文件系统在分区中是以如下方式组织分区空间的:

格式化分区的具体命令有mkfs,mke2fs,用法如下:

1. mkfs.FS_TYPE OPTION DEVICE 或者 mkfs -t FS_TYPE DEVICE
                有用OPTION:
                        -L 'LABEL' 添加lable
                注:FS_TYPE为ext2, ext3, ext4, xfs, btrfs, reiserfs, jfs, swap等文件系统名称。

2. mke2fs OPTION DEVICE_NAME,DEVICE_NAME指分区名称
        OPTION:
            -t {ext2|ext3|ext4}
            -b {1024|2048|4096} 设置存储基本单元block的大小
            -L 'LABLE' 用于设置分区的LABEL
            -j 相当于-t ext3, 即使用日志功能
            -i #: 为数据空间中每多少个字节创建一个inode, 此大小不应该小于block的大小,
                            否则inode的数量将比block还多。。。。。。
            -N #: 为数据空间创建多少个inode
            -m #: 为管理人员预留的空间占据的百分比. 默认是5, 即5%
            -O FEATURE[,…] 启用指定特性
            -O ^FEATURE[,…] 关闭指定特性
            注:mkfs.ext3 = mkfs -t ext3 = mke2fs -j = mke2fs -t ext3

其他常用命令:

1. blkid 分区: 显示分区信息
    或者:
    blkid -U UUID 根据UUID查找设备
    blkid -L LABEL 根据LABEL查找设备

2. e2lable DEVICE [LABEL],查看或设定LABEL
3. tune2fs OPTION DEVICE_NAME: 重新设定ext系统文件系统可调整参数的值
    OPTION:
        -l 查看超级块信息
        -L 'LABEL' 设定LABEL
        -m # 修改预留给管理人员的空间百分比
        -j: 打开日志功能, 将ext2 升级为ext3
        -O 文件系统属性启用或禁用
        -o 指定默认挂载选项
4. dumpe2fs OPTION DEVICE_NAME: 输出DEVICE的信息
    OPTION:
        -h: 查看超级块信息
5. mkswap: 创建交换空间
    用法:mkswap [OPTION] DEVICE
    注意:前提调整DEVICE类型为82,可用类型可以通过fdisk DEVICE然后输入l查看。

文件系统监测与修复命令:
1.fsck: file system check的简写,用法如下:
fsck.FS_TYPE 或 fsck -t FS_TYPE
FS_TYPE 一定要与分区实际的文件系统类型对应
OPTION:
-a 自动修改错误
-r 交互式修复错误
e2fsck: ext系列文件系统专用
-y 自动回答为yes
-f 强制修复

爬取糗事百科的Python脚本

发表于 2017-10-26 | 分类于 python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#糗事百科
import urllib.request
import re
headers = ("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0")
opener = urllib.request.build_opener()
opener.addheaders = [headers]
urllib.request.install_opener(opener)
for k in range(0,10):
url = "http://www.qiushibaike.com/8hr/page/"+ str(k)
data = opener.open(url).read().decode('utf-8','ignore')
pat = '<div class="content">\s*?<span>(.*?)</span>.*?</div>'
rst = re.compile(pat,re.S).findall(data)
for i in range(0,len(rst)):
print(rst[i])
print("----------------")

linux一些经典书籍

发表于 2017-10-25 | 分类于 linux

一、linux之路,路漫漫其修远兮,吾将上下而求索!先上经典书籍!

1.入门篇

《LINUX权威指南》书不错,写的很全面也比较广,涉及的不深,做为入门书籍不错,可以比较全面的了解linux 。另外比较热门的也可以看看《鸟哥的私房菜》等书,偏管理类的书。如果想做server方向的可以找来看看。

2.驱动篇

《LINUX设备驱动程序 》就是网上说的“LDD”,经典之作,必备书籍。国产经典《Linux驱动详细解》也是一本非常不错的书,很实用,书中源代码 分析比较多,基于2440的,对linux外围驱动有很全面的讲解。

3.内核篇

浙江大学的《LINUX内核源代码情景分析》,外国的《UNIX源代码分析》还有《深入理解linux内核》都是出名的经典巨作。

4.shell篇

《LINUX与UNIX Shell编程指南》

5.应用编程

不用说了肯定是《unix环境高级编程》被称为unix编程的圣经。

6.TCP/IP篇

《TCP/IP详解》作者W.Richard Stevens也是《unix环境高级编程》的作者,牛人出的书没有一本不是经典的。但是英年早逝,默哀一下。

7.c语言

《The C Programming Language》正是作者造出来的c语言,书能垃圾就怪了。
《c和指针》和《c缺陷和陷阱》两本必备。包含了c语言最容易出错的地方,加深c语言功力的好材料。

c专家编程,c语言技术手册, Practice c Programming 等。

8.算法

《算法导论》,床头必备喝

注:这些经典的书是经得起反复琢磨的,知识并不是一蹴而就的,需要反复实践,反复理解!千万不要妄想一口吃个胖子!

二、如何学习linux

Linux操作系统主要就是一些配置文件(/etc)和命令行工具(/bin /sbin /usr/bin /usr/sbin),要掌握操作系统的主要目录结构和配置文件,运用系统的命令行工具(shell脚本)完成常规的操作系统维护工作,监控工作。进而可以安装部署一些企业应用,进行监控、管理等等。

1.重要的命令:find,sed,awk,正则……

2.工具:gnu下的著名软件 gcc,gdb,vi,make……

3.unix编程,编译等。xwin开发方式,gtk,qt……

4.文件系统,/dev下的设备(会用),/var下重要的东西,/etc 下的配置(常用服务配置apache, ftpd, sshd, xinetd, squid, natd, named),系统启动顺序,配置相应服务等……

5.c,python,php等高级语言……

三、个人水平定位

1.初级:熟练使用命令、熟悉Shell编程、能配置简单的服务,清楚各类服务相关的配置文件的位置, 能看懂并可修改系统提供的配置脚本(/etc/.)。推荐书籍:
《鸟哥的私房菜基础篇、高级篇》
《Advanced Bash Shell》
2.中级:熟悉TCP/IP原理、OS原理、熟练使用C语言、Linux系统编程、网络编程。 推荐书籍:
《The C Programming Language》
《Unix环境高级编程》
《Linux程序设计》
《TCP/IP协议详解卷一》
《Unix网络高级编程》
3.高级: 内核,驱动级别。推荐书籍:
《Linux Device Driver》
《深入理解Linux内核》
《深入理解计算机系统》
《深入理解LINUX网络内幕》

四、学习途径

1.Help System 帮助文档(man)

2.online books 在线文档(wiki ,blogs)

3.Training Guide 培训教程

4.Topic Collections 专题

5.Forms 论坛

6.名家的书籍

7.IRC,邮件列表等

8.理论与理论中的实践的差别并不如理论与实践中的实践差别那样大!

五、其他的书

javascript基础教程,~高级程序设计,~权威指南,~DOM编程艺术,~设计模式,~入门经典

UNIX in a Nutshell,The unix programming environment,unix技术手册

managing projects with make

applying RCS and SCCS

六、自己的路

linux/unix (c , bash(shell) , 工具(vi, gcc, make) , 内核机制 , python(高级语言) , 开源)

设计理念,系统管理,unix环境,服务器,嵌入式,桌面,移动设备

linux目录详解

发表于 2017-10-24 | 分类于 linux

1、/- 根
每一个文件和目录从根目录开始。
只有root用户具有该目录下的写权限。请注意,/root是root用户的主目录,这与/.不一样

2、/bin中 - 用户二进制文件
包含二进制可执行文件。
在单用户模式下,你需要使用的常见linux命令都位于此目录下。系统的所有用户使用的命令都设在这里。
例如:ps、ls、ping、grep、cp

3、/sbin目录 - 系统二进制文件
就像/bin,/sbin同样也包含二进制可执行文件。
但是,在这个目录下的linux命令通常由系统管理员使用,对系统进行维护。例如:iptables、reboot、fdisk、ifconfig、swapon命令

4、/etc - 配置文件
包含所有程序所需的配置文件。
也包含了用于启动/停止单个程序的启动和关闭shell脚本。例如:/etc/resolv.conf、/etc/logrotate.conf

5、/dev - 设备文件
包含设备文件。
这些包括终端设备、USB或连接到系统的任何设备。例如:/dev/tty1、/dev/usbmon0

6、/proc - 进程信息
包含系统进程的相关信息。
这是一个虚拟的文件系统,包含有关正在运行的进程的信息。例如:/proc/{pid}目录中包含的与特定pid相关的信息。
这是一个虚拟的文件系统,系统资源以文本信息形式存在。例如:/proc/uptime

7、/var - 变量文件
var代表变量文件。
这个目录下可以找到内容可能增长的文件。
这包括 - 系统日志文件(/var/log);包和数据库文件(/var/lib);电子邮件(/var/mail);打印队列(/var/spool);锁文件(/var/lock);多次重新启动需要的临时文件(/var/tmp);

8、/tmp - 临时文件
包含系统和用户创建的临时文件。
当系统重新启动时,这个目录下的文件都将被删除。

9、/usr - 用户程序
包含二进制文件、库文件、文档和二级程序的源代码。
/usr/bin中包含用户程序的二进制文件。如果你在/bin中找不到用户二进制文件,到/usr/bin目录看看。例如:at、awk、cc、less、scp。
/usr/sbin中包含系统管理员的二进制文件。如果你在/sbin中找不到系统二进制文件,到/usr/sbin目录看看。例如:atd、cron、sshd、useradd、userdel。
/usr/lib中包含了/usr/bin和/usr/sbin用到的库。
/usr/local中包含了从源安装的用户程序。例如,当你从源安装Apache,它会在/usr/local/apache2中。

10、/home - HOME目录
所有用户用home目录来存储他们的个人档案。
例如:/home/john、/home/nikita

11、/boot - 引导加载程序文件
包含引导加载程序相关的文件。
内核的initrd、vmlinux、grub文件位于/boot下。
例如:initrd.img-2.6.32-24-generic、vmlinuz-2.6.32-24-generic

12、/lib - 系统库
包含支持位于/bin和/sbin下的二进制文件的库文件.
库文件名为 ld或lib.so.*
例如:ld-2.11.1.so,libncurses.so.5.7

13、/opt - 可选的附加应用程序
opt代表可选的。
包含从个别厂商的附加应用程序。
附加应用程序应该安装在/opt/或者/opt/的子目录下。

14、/mnt - 挂载目录
临时安装目录,系统管理员可以挂载文件系统。

15、/media - 可移动媒体设备
用于挂载可移动设备的临时目录。
举例来说,挂载CD-ROM的/media/cdrom,挂载软盘驱动器的/media/floppy;

16、/srv - 服务数据
srv代表服务。
包含服务器特定服务相关的数据。

Hello World

发表于 2017-09-10

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

Run server

1
$ hexo server

More info: Server

Generate static files

1
$ hexo generate

More info: Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment

keystone介绍

发表于 2017-09-05 | 分类于 云计算

identity即keystone,它是openstack的验证中心,所有的服务都由它来认证。参考 http://blog.csdn.net/wsfdl/article/details/20492343

在keyston中有以下角色:tenants(租户或项目)、用户、角色、服务目录和端点

  • 如果把宾馆比作为Tenant,住宿的人就是User ,宾馆可以提供多种诸如住宿、娱乐、饮食等多种服务(Service),具体来说,住宿是一种具体的服务(Endpoint)。就住宿而言,有普通间和总统套房,如果你的VIP等级(Role)高,你可以享受到豪华的总统套房。入住前,我们需要拿身份证开房(Credential),认证身份证不是冒牌货后(Authenticaiton),会给你一个房卡(Token),然后你拿着房卡,就可以进入房间和享受各种服务。

以创建一个虚拟机(server)为例,keystone在openstack的访问流程大致如下:

  1. 用户Alice通过自己的户名和密码向keystone申请token,keystone认证用户名和密码后,返回token1
  2. Alice通过token1发送keystone查询他所拥有的租户,keystone验证token1成功后,返回Alice的所有Tenant
  3. Alice选择一个租户,通过用户名和密码申请token,keystone认证用户名、密码、tenant后,返回token2。(其实1、2步仅仅是为了查询tenant,如果已经知道tenant,可以忽略1、2步)
  4. Alice通过token2发送创建server的请求,keystone验证token2(包括该token是否有效,是否有权限创建虚拟机等)成功后,然后再把请求下发到nova,最终创建虚拟机

云计算openstack入门

发表于 2017-09-01 | 分类于 云计算

云计算概述

  • 云计算从广义上可以分为如下几种模式:IaaS(基础设施即服务)、PaaS(平台即服务)、SaaS(软件即服务)
  1. IaaS Amazon、阿里云、腾讯云提供的云主机即IaaS,我们拿到的是一台机器,可以自定义操作系统。
    PaaS 面向开发者,直接给用户提供一个平台来运行用户的程序,早期的idc服务商卖的主机、新浪的sae、阿里云的云数据库等。
  2. SaaS 卖的是服务,比如腾讯企业邮箱、印象笔记等
  3. openstack是目前比较流行的一个实现云计算平台的项目

openstack简介

  • 发布版本 http://releases.openstack.org/
    目前稳定版本为Liberty

6个核心服务:nova(计算中心,对比阿里云的ESC,支持kvm,xen等虚拟化技术)、keystone(认证中心)、neutron(网络服务中心)、swift(对象存储服务,存储图片,附件等文件,对比腾讯云的COS)、cinder(块存储服务,云盘)、glance(镜像管理中心)

image

Shell 基础

发表于 2017-08-31 | 分类于 Shell

shell基础知识

  • shell的定义:linux shell就是我们输入命令的命令行,他的作用就是将我们输入的命令解释成内核可以识别的代码(0或1),shell可以直接调用linux系统命令,也是一门脚本语言,可以把linux的命令写成一个脚本(shell 脚本)达到自动化运维的目的,shell脚本其实就是一组命令的集合,里面也可以有判断,函数,数组,循环等功能,是一个简单的脚本编程语言。
  • shell 大致分为“Bourne Shell”,“C Shell”这两种shell的语法彼此不兼容,C Shell 主要在BSD版本的Unix系统中使用,语法和C语言相类似。Bourne家族主要包括sh ksh Bash pah zsh这些。C家族主要包括 csh 和tcsh。我们linux中使用的是Bourne家族中的Bash。
  • 我们的linux默认支持的shell可以查看“/etc/shells”文件,文件里面每行就代表一种shell。我们可以在命令行直接输入文件里面的每一行的内容,就可以切换到指定shell,输入exit,可以退出返回到我们的上一个shell中。在这个文件里面有个“/sbin/nologin”这个和“/etc/passwd”文件中的很多用户的最后很相似,第7列的意思是用户登录到linux系统中的权限,如果这里是“/sbin/nologin”那就代表不允许登录,如果是“/bin/bash”就代表登录后可以使用权限范围内的bash的所有功能,如果是类似于“/sbin/shutdown”代表这个用户只能执行“/sbin/shutdown”这条命令

Shell脚本的执行

  1. 赋予执行权限(x权限),直接运行,如果script.sh在root根目录。当前shell目录也在root根目录下面
    a) chmod 755 script.sh
    b) ./script.sh
    c) 还可以绝对路径执行 /root/ script.sh
  2. 通过bash调用执行脚本(推荐)
    a) bash script.sh
    b) sh scritp.sh
如果执行的脚本是用windows编辑好复制到linux来的,那么运行的时候会报错。因为两种系统的加车符号不一样。linux的回车符号是“$”(可以用cat –A 可以查看到文件的回车符), windows的回车符号是“^M$”。这时候我们可以用工具进行转换,这个工具需要安装,dos2unix或者unix2dos分别是从windows到linux和linux到windows的转换,需要哪个装哪个
12

王一川

iipirate.github.io

14 日志
7 分类
7 标签
© 2017 王一川
由 Hexo 强力驱动
|
主题 — NexT.Pisces v5.1.2