shell编程-日常范例积累

  根据本人学习经验,对于shell编程来说,如果不是专门的shell编程人员,系统的学习这方面知识很容易忘记,收效甚微。所以我根据日常使用过程中的积累,不断添加使用范例,来达到学习和积累的目的。
所以本文会持续的添加内容。

awk使用

  1. 统计一个像矩阵一样的文件有多少列:
    1
    head -n 1 <filename> | awk -F <separator> '{print NF}'

OpenVPN搭建

  注:1. 本次搭建环境为archlinux arm平台, 但是通过本人多次实践以及对不同平台的了解,基本操作和原理完全相同。

     2.OpenVPN 需要内核模块tun支持。使用命令 modprobe tun 检测是否有此模块,若无可能需要重新便宜linux kernel.

Step 1: 安装

  安装openvpn和easy-rsa。

1
pacman -S openvpn easy-rsa

Step 2:证书生成

1
2
3
4
5
6
7
8
9
10
cp -r /etc/easy-rsa ~/easy-rsa //将easyrsa配置拷贝到home目录
cd ~/easy-rsa
easy-rsa init-pki //初始化pki(Public Key Infrastructure)环境
easy-rsa build-ca nopass //生成根证书,即将自己作为CA,此处nopass选择不加密生成的密钥
//正常的证书签发流程是:生成客户私钥以及向CA发起证书签发申请,然后由CA签发证书。
//这里我们省略了gen-req和sign-req,使用一条命令生成证书。以上只是说明其内部实际是两个过程。
easy-rsa build-server-full server nopass //生成server端证书
easy-rsa build-client-full client nopass //生成client端证书
easy-rsa gen-dh //生成Diffie-Hellman密钥交换协议的参数
openvpn --genkey --secret pki/ta.key //生成“HMAC firewall”,防止DoS攻击和UDP port flooding

  至此,便生成了说需要的所有证书和密钥。

Step 3: server conf配置

1
2
3
sudo cp pki/ca.crt pki/issued/server.crt pki/ta.key pki/dh.pem pki/private/server.key /etc/openvpn/server/
sudo cp /usr/share/openvpn/examples/server.conf /etc/openvpn/server
sudo vim /etc/openvpn/server

  以下为我的配置,可作为参考:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
port 1194
proto udp6 #使用ipv6, 否则使用proto udp
dev tun0
ca ca.crt
cert server.crt
key server.key
dh dh.pem
server 10.10.0.0 255.255.255.0
server-ipv6 fd00:c0a8:ed00::/64 # if you want use ipv6, use this config
ifconfig-pool-persist ipp.txt
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 114.114.114.114"
push "dhcp-option DNS 8.8.8.8"
duplicate-cn #如果每个client使用相同的证书,必须开启此项
keepalive 10 120
tls-auth ta.key 0
cipher AES-256-CBC
comp-lzo
max-clients 20
user nobody
group nobody
persist-key
persist-tun
status openvpn-status.log
log openvpn.log
verb 3
mute 20

Step 4: 测试

  到目前为止,server基本配置完毕。临时启动server进行测试。

1
2
3
sudo su
cd /etc/openvpn/server
openvpn --config /etc/openvpn/server/server.conf

  然后查看是否有tun0网卡,以及网卡信息与配置是否一致。

1
ifconfig

Step 5: 通过VPN上网

  现在我们的openvpn server已经可以接受client连入了,但是client还不能上网。所以需要将openvpn子网的连接转发到可上网的网卡,如eth0.

1
sudo vim /etc/sysctl.d/99-sysctl.conf #我使用的archlinux已经没有/etc/sysctl.conf了,已经改为了这种结构

  配置如下:

1
net.ipv4.ip_forward=1

  然后就可以用iptable进行转发了。

1
2
3
4
sudo su
iptables -t nat -A POSTROUTING -s 10.10.0.0/24 -o eth0 -j MASQUERADE
iptables-save > /etc/iptables/iptables.rules
systemctl enable iptables

Step 6: 开机启动

  OpenVPN在安装时自带system service,但是使用的是模板语法。在我的平台上,该模板名称为openvpn-server@.service。具体可到/usr/lib/systemd/system目录下查看。该模板使用%i对conf文件进行输入,所以在本平台上创建开机启动项如下(可根据实际情况修改):

1
sudo systemctl enable openvpn-server@server.service

Step 7: Client配置

  我的client配置采用windows上openvpn目录下sample-config中的client.ovpn作为模板,下面是我的配置,可作为参考,根据自身情况修改。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
client
dev tun
remote ipv6-address 1194 udp6 #使用ipv6时这样配置,1194是对应server的端口。
remote ipv4-address 1194 udp #ipv4配置
##如果只使用ipv4,使用下面格式即可
#proto udp
#remote ipv4-address 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client.crt
key client.key
remote-cert-tls server
tls-auth ta.key #该文件与server端的相同
cipher AES-256-CBC
comp-lzo
verb 3
mute 20
auth-nocache

  在client使用前,需要将之前easy-rsa生成的ca.crt, client.key, client.crt, ta.key拷贝到客户端openvpn config目录下。

Linux locale 缺失与安装

1.一般情况

查看当前locale设置:

1
locale

查看系统目前可用的locale配置:

1
locale -a

  如果某种locale不在上述列表中出现,可以使用locale-gen命令来安装该种locale。

1
locale-gen zh_CN.UTF-8

  上述命令会安装 zh_CN.UTF-8。

修改当前locale配置:

  可以直接编辑/etc/default/locale文件,也可以使用如下命令来修改该文件:

1
update-locale LANG=zh_CN.UTF-8

2.遇到的问题

en_US.UTF-8… cannot open locale definition file ‘translit_neutral’: No such file or directory failed

解决:

  从别的机器上copy /usr/share/i18n 覆盖本机。

3. 小结

  1. 全新字符库编码信息位于 /usr/share/i18n目录下面,其中SUPPORTED中包含可用的所用字符集。其中的charmaps存的每种字符集的映射信息。使用localedef可以生成字符集,就是locales里面那些东西。但这些并不是系统中能用的字符集。刚才描述的这些/usr/share/i18n里面的文件只能算是可用的字符集,locale -m可以看到列表。

  2. 为了让系统能使用,原始的/usr/share/i18n中的文件要经过处理(complile),能用的字符编码在/usr/lib/locale/下面,成为complied字符集。

  3. 使用locale-gen可以把原始的/usr/share/i18n中的文件complie成系统能用的/usr/lib/locale/地字符集。所以当使用locale-gen 命令出现由某些文件确实而失败的情况,往往是由/usr/share/i18n下缺少相应文件导致的。

  4. /usr/share/i18n里面的东西操作系统无关,不同体系结构不同系统可以通用,若有缺失,从其他地方复制来便可。

  reference: http://blog.csdn.net/yunhuang2010/article/details/8109578

HMM学习笔记

1.简介

 隐马尔克夫模型可以用两组状态集合和三组概率集合来描述:

  (1) 隐藏状态: 隐藏在观察状态后的状态

  (2) 观察状态: 表象看到的状态

  (3) 初始概率集合: 包含了隐状态在t=1时刻的初始选择概率

  (4) 状态转移矩阵: 包含了隐藏状态到另一个隐藏状态的概率

  (5) 混淆矩阵: 包含了隐马尔克夫模型的某一个隐藏状态观察到某个观察状态的概率。

  ● HMM有一个最重要也是非常不符合实际的假设:以上各种概率不随时间的迁移而改变。

  ● 因此一个HMM是在一个马尔克夫过程中引入一组隐藏状态以及与其相关的观察状态的概率关系。

2.定义

 一个HMM是一个三元组(pi, A, B)。


  其中xij表示j时刻的隐藏状态为xi, i ∈ {1…n}, n为隐藏状态的书目。

  Pr(yi | xj)表示在隐藏状态xj下观察到观察状态yi的概率。

3.应用

 一旦一个系统可以作为HMM来描述,就可以解决三个基本问题:

(1) 评估

   问题描述: 这种情况知道一些(pi, A, B)的HMM模型,对于给定的观察状态序列,计算最有可能产生该序列的HMM。即计算HMM产生观察序列的概率。

   解决方法: 前向算法(forward algorithm)

   算法描述:

(2) 解码

   问题描述: 这种情况知道观察序列以及对应的HMM模型,计算与观察序列对应的最有可能的隐藏序列。

   解决方法: Viterbi算法

   算法描述:

(3) 学习

   问题描述: 根据一个观察序列(来自于已知的集合),以及与其有关的一个隐藏状态集,估计一个最合适的隐马尔科夫模型(HMM),也就是确定对已知序列描述的最合适的(pi,A,B)三元组。

   解决方法: 前向-后向算法

   算法描述:

    a.后向算法

    b.前向后向算法


/proc/cpuinfo文本分析

  在linux系统中,如果想了解系统中CPU的相关信息,可以通过/proc/cpuinfo文件找到。本文章针对该文件某些输出项进行介绍。



  processor :系统中逻辑处理核的编号

  vendor_id :CPU制造商

  cpu family :CPU产品系列代号

  model   :CPU属于其系列中的哪一代的代号

  model name:CPU属于的名字及其编号、标称主频

  cpu MHz  :CPU的实际使用主频

  cache size :CPU二级缓存大小

  physical id :单个CPU的标号

  siblings :单个CPU逻辑物理核数

  core id :当前逻辑核所在的物理核在其所处CPU中的编号

  cpu cores :该逻辑核所处CPU的物理核数

  apicid :用来区分不同逻辑核的编号,系统中每个逻辑核的此编号必然不同,此编号不一定连续

  fpu :是否具有浮点运算单元(Floating Point Unit)

  fpu_exception :是否支持浮点计算异常

  cpuid level :执行cpuid指令前,eax寄存器中的值,根据不同的值cpuid指令会返回不同的内容???

  wp :表明当前CPU是否在内核态支持对用户空间的写保护(Write Protection)

  flags :当前CPU支持的功能

  bogomips :在系统内核启动时粗略测算的CPU速度(Million Instructions Per Second)

  clflush size :每次刷新缓存的大小单位

  cache_alignment :缓存地址对齐单位

  address sizes :可访问地址空间位数???



  根据以上内容,我们则可以很方便的知道当前系统关于CPU、CPU的核数、CPU是否启用超线程等信息。

  1. 查询系统具有多少个逻辑核: cat /proc/cpuinfo | grep "processor" | wc -l

  2. 查询系统单个CPU的物理核数:cat /proc/cpuinfo | grep "cpu cores" | uniq

  3. 查询系统CPU是否启用超线程:cat /proc/cpuinfo | grep -e "cpu cores" -e "siblings" | sort | uniq

    如果cpu cores数量和siblings数量一致,则没有启用超线程,否则超线程被启用。

  4. 查询系统CPU的个数:cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l

OpenStack 虚拟机状态卡死之处理方法


方法:

1. nova list //找到对应的vm id
2. nova reset-state id //重设vm状态
3. nova stop id //关闭vm电源
4. nova start id




注意:

   nova 操作需要user, tenant信息,只有设定好这个才能查看到对应user和tenant下的vm信息,而且user需要是该tenant的管理员。

A legal openrc maybe looks like this:


1
2
3
4
export OS_USERNAME=xxx
export OS_PASSWORD=****
export OS_TENANT_NAME=xxx
export OS_AUTH_URL=http://controller:35357/v2.0