SNMP(Simple Network Management Protocol,简单网络管理协议)的前身是简单网关监控协议(SGMP),用来对通信线路进行管理。在RHEL中,SNMP的配置文件地址是/etc/snmp/snmpd.conf。snmpd.conf的配置项很多,但是真正常用的就那么几个,下面来逐个介绍。

com2sec命令,它的基本语法是“com2sec NAME SOURCE COMMUNITY”。这里要提一下SNMP的安全策略,其实SNMP的安全性并不好,在这个协议中使用COMMUNITY这个东西来做访问控制的。简单来理解就是现在有一个帮会的一个人找去了总舵,那么这个人怎么跟总舵相认呢?他们直接约定一个“暗号”,例如见面就说“床前明月光”,那么总舵的前台就会带你去“床前明月光”想对应的地方。现在回过头来看这行配置,假如有以下一句话

com2sec  magusu default  magus

意思就是做一个映射,把magus这个COMMUNITY串和magusu这个名字做好一对映射,那么以后在调用SNMP的时候,只要你声明你就是magus,那么就可以获得相应的权限了。有了映射以后下面需要做的是建立一个从magusu到组的一个映射,用到的命令是group,它的基本语法是“group NAME MODEL SECURITY”

group  magusg v2c  magusu

上面这句话的意思就是把magusu放到组magusg里面,用的协议是v2c,插一句,SNMP现在通常用的有3个版本。那好了,组建好了下来要做什么呢?就是要建立一个VIEW,VIEW的基本语法是“view NAME TYPE SUBTREE [MASK]”

view  magusv  included  .1.3.6.1.4.1.9129

像上面这句话的意思就是赋予magusv这个view能够查看1.3.6.1.4.1.9129下面所有节点的权限。最后要做的是设定哪些组的人,哪些view的用户可以做什么具体的事情,用access来设置,基本语法是“access NAME CONTEXT MODEL LEVEL PREFX READ WRITE NOTIFY”。

access   magusg   “”   any   noauth   exact   magusv   magusv   none

由于例子中用的是v2c版本的协议,所以CONTEXT必须为空,MODEL也就是协议的版本号,在这里例子里面可以是any也可以是v2c,还是由于v2c的缘故,所以LEVEL是noauth;READ、WRITE和NOTIFY分别需要指定一个view或者什么都不指定;在这里的设置就是magusv这个view可以对前面设置好的节点进行读和写操作。

到此,服务端的配置已经完成,重启一下snmpd就可以了,下面看看如何通过SNMP得到我们想要的数据

snmpwalk -v 2c -c magus localhost 1.3.6.1.4.1.9129.1.2.2

snmpwalk可以便利指定节点下的所有子节点,-v 参数指定SNMP的协议版本,这个跟我们之前配置服务器的版本是要一致的,也就是2c,然后-c参数就指定了community的字符串,也就是刚才定义的magus,然后就是主机地址,由于我在本机测试,所以用的localhost,实际中可以填上IP,最后就是OID的值。搞定!

对于刚刚接触SNMP的朋友来说,理解community的作用是关键,其实说的通俗点就是接头暗号,而且还是个明文的“暗号”。

No related posts.

现在我们在目标机上来写一些脚本来显标 MEM 、 CPU 、 DiskIO 
MEM 数据的抓取脚本: 
[root@wy1 root]# cat  mfree.sh    
#!/bin/sh 
/usr/bin/free -m | grep Mem |awk '{print $4}' 
/usr/bin/free -m | grep Mem |awk '{print $2}' 
[root@wy1 root]# sh  mfree.sh   ( 上面一个数据是内存使用量,下面的是内存总量 ,M) 
442  
1006 
CPU 数据的抓取脚本 
[root@wy1 root]# cat  cpustat.sh 
#!/bin/sh 
idle=`sar  -u 1 3 | grep Average | awk '{print $6}'` 
used=`echo "101 - $idle" | bc -l -s` 
echo $used 
echo $idle 
DiskIO 数据的抓取脚本 
[root@wy1 root]# cat  iostat.sh     (显示硬盘 IO , k/s ) 
#!/bin/sh 
used1=`sar -d 1 3 | tail -1 | awk '{print $4}'` 
used2=`echo "$used1 / 2" | bc -l` 
echo $used2 
echo $used2

好现在我们已经能得到这数据了,怎么才能让监控主机通过 snmpd 得到这些数据呢?可以在目标主机的/etc/snmp/snmpd.conf 文件下面加个这些行: 
exec .1.3.6.1.4.1.2021.53 mfree /bin/sh /root/mfree.sh 
 exec .1.3.6.1.4.1.2021.54 cpustat /bin/sh /root/cpustat.sh 
 exec .1.3.6.1.4.1.2021.55 iostat /bin/sh /root/iostat.sh 
service  snmpd  restart   重启目标主机上的 snmpd 服务。 
这样在监控主机上运行 : 
   [root@wy2 root]# snmpwalk -v 1  192.168.13.103 -c public .1.3.6.1.4.1.2021.53 
UCD-SNMP-MIB::ucdavis.53.1.1 = INTEGER: 1 
UCD-SNMP-MIB::ucdavis.53.2.1 = STRING: "mfree" 
UCD-SNMP-MIB::ucdavis.53.3.1 = STRING: "/bin/sh /root/mfree.sh" 
UCD-SNMP-MIB::ucdavis.53.100.1 = INTEGER: 0 
UCD-SNMP-MIB::ucdavis.53.101.1 = STRING: "442" 
UCD-SNMP-MIB::ucdavis.53.101.2 = STRING: "1006" 
UCD-SNMP-MIB::ucdavis.53.102.1 = INTEGER: 0 
其中 UCD-SNMP-MIB::ucdavis.53.101.1 = STRING: "442"  中的 442 就是 mfree.sh 输出的第一个数据, 1006 是mfree.sh 输出的第二个数据。 OK ,再做一下加工: 
[root@wy2 root]# snmpwalk -v 1  192.168.13.103 -c public .1.3.6.1.4.1.2021.53 | grep 53.101 | awk -F/" '{print $2}' 
443 
1006 
好,我们已经通过 snmpd 从监控主机上得到了目标主机上内存使用的这两个数据了:) , 其它的两个脚本也一样:
  CPU 使用、空闲。 
[root@wy2 root]# snmpwalk -v 1  192.168.13.103 -c public .1.3.6.1.4.1.2021.54 | grep 54.101 | awk -F/" '{print $2}' 
1.17 
99.83 
   DISK IO  状态: 
[root@wy2 root]# snmpwalk -v 1  192.168.13.103 -c public .1.3.6.1.4.1.2021.55 | grep 55.101 | awk -F/" '{print $2}' 
43.00000000000000000000 
43.00000000000000000000

最 后是编辑监控主机上的 mrtg.cfg 文件,在 Target[xxxx] 中加入上面的命令,下面是我的 mrtg.cfg 文件,前面的两个 Target 是我用 /usr/bin/cfgmaker --global 'WorkDir: /home/httpd/mrtg/net' --
global 'Options[_]:growright,bits' --ifref=ip public@192.168.13.103   命令生 成的,
后面的是我跟据 platinum  的 "mrtg 能做些什么 " 的贴子内的 mrtg.cfg 文件改的。(在精华里,大家可以看一下)。 
[root@wy1 root]# cat /home/httpd/mrtg/103/mrtg.cfg  
# Created by  
# /usr/bin/cfgmaker --global 'WorkDir: /home/httpd/mrtg/net' --global 'Options[_]:growright,bits' --ifref=ip public@192.168.13.103

### Global Config Options

#  for UNIX 
# WorkDir: /home/http/mrtg

#  or for NT 
# WorkDir: c:/mrtgdata

### Global Defaults

#  to get bits instead of bytes and graphs growing to the right 
# Options[_]: growright, bits

WorkDir: /home/httpd/mrtg/103 
Options[_]:growright,bits 
Language: chinese 
###################################################################### 
# System: wy1 
# Description: Linux wy1 2.4.20-8smp #1 SMP Thu Mar 13 17:45:54 EST 2003 i686 
# Contact: Root <root@wuying.com > (configure /etc/snmp/snmp.local.conf) 
# Location: wy1.wuying.com (edit /etc/snmp/snmpd.conf ) 
######################################################################

### Interface 2 >> Descr: 'eth0' | Name: '' | Ip: '192.168.13.103' | Eth: '00-06-5b-19-9d-ea' ###

Target[192.168.13.103_192.168.13.103]: /192.168.13.103:public@192.168.13.103: 
SetEnv[192.168.13.103_192.168.13.103]: MRTG_INT_IP="192.168.13.103" MRTG_INT_DESCR="eth0" 
MaxBytes[192.168.13.103_192.168.13.103]: 1250000 
Xsize[192.168.13.103_192.168.13.103]: 300 
Ysize[192.168.13.103_192.168.13.103]: 100 
#kmg[192.168.13.103_192.168.13.103]: K/s,M/s 
#kilo[192.168.13.103_192.168.13.103]: 1024 
Title[192.168.13.103_192.168.13.103]: Traffic for eth0 192.168.13.103 -- wy1 
PageTop[192.168.13.103_192.168.13.103]: <H1>Traffic for eth0 192.168.13.103 -- wy1</H1> 
#Options[192.168.13.103_192.168.13.103]: growright,gauge,nopercent

### Interface 3 >> Descr: 'eth1' | Name: '' | Ip: '172.16.0.188' | Eth: '00-06-5b-19-9d-e9' ###

Target[192.168.13.103_172.16.0.188]: /172.16.0.188:public@192.168.13.103: 
SetEnv[192.168.13.103_172.16.0.188]: MRTG_INT_IP="172.16.0.188" MRTG_INT_DESCR="eth1" 
Xsize[192.168.13.103_172.16.0.188]: 300 
Ysize[192.168.13.103_172.16.0.188]: 100 
MaxBytes[192.168.13.103_172.16.0.188]: 1250000 
#ShortLegend[192.168.13.103_172.16.0.188]:  
#kmg[192.168.13.103_172.16.0.188]: b/s,Kb/s 
#kilo[192.168.13.103_172.16.0.188]: 1024 
Title[192.168.13.103_172.16.0.188]: Traffic for eth1 172.16.0.188 -- wy1 
PageTop[192.168.13.103_172.16.0.188]: <H1>Traffic for eth1 172.16.0.188 -- wy1</H1> 
#Options[192.168.13.103_172.16.0.188]: growright,gauge,nopercent

###MEM status

Target[wy1_mem]:`snmpwalk -v 1  192.168.13.103 -c public .1.3.6.1.4.1.2021.53 | grep 53.101 | awk -F/" '{print $2}'` 
#Targey[wy1_mem]: memTotalReal.0&memAvailReal.0:holdata@holdata.3322.org 
Xsize[wy1_mem]: 300 
Ysize[wy1_mem]: 100 
Ytics[wy1_mem]: 7 
MaxBytes[wy1_mem]: 1006 
Title[wy1_mem]:Memory State of WY1 IP 192.168.13.103 Server 
PageTop[wy1_mem]:<H1>Memory State of WY1 IP 192.168.13.103 Server</H1> 
ShortLegend[wy1_mem]: MB 
kmg[wy1_mem]: MB 
kilo[wy1_mem]:1024 
YLegend[wy1_mem]: Memory Usage 
Legend1[wy1_mem]:  可用内存 
Legend2[wy1_mem]:  总内存量 
Legend3[wy1_mem]:  可用内存 
Legend4[wy1_mem]:  总内存量 
LegendI[wy1_mem]:  可用内存 
LegendO[wy1_mem]:  总内存量 
Options[wy1_mem]: growright,gauge,nopercent

###cpu status 
Target[wy1_CPU]:`snmpwalk -v 1  192.168.13.103 -c public .1.3.6.1.4.1.2021.54 | grep 54.101 | awk -F/" '{print $2}'` 
#Targey[wy1_CPU]: memTotalReal.0&memAvailReal.0:holdata@holdata.3322.org 
Xsize[wy1_CPU]: 300 
Ysize[wy1_CPU]: 100 
Ytics[wy1_CPU]: 7 
MaxBytes[wy1_CPU]: 100 
Title[wy1_CPU]:CPU State of WY1 IP 192.168.13.103 Server 
PageTop[wy1_CPU]:<H1>CPU State of WY1 IP 192.168.13.103 Server</H1> 
ShortLegend[wy1_CPU]:  
kmg[wy1_CPU]: % 
#kilo[wy1_CPU]:1024 
YLegend[wy1_CPU]: CPU Usage  
Legend1[wy1_CPU]:  已用 CPU:  
Legend2[wy1_CPU]:  可用 CPU:   
LegendI[wy1_CPU]:  已用 CPU:  
LegendO[wy1_CPU]:  可用 CPU:  
Options[wy1_CPU]: growright,gauge,nopercent

###iostat 
###cpu status 
Target[wy1_IO]:`snmpwalk -v 1  192.168.13.103 -c public .1.3.6.1.4.1.2021.55 | grep 55.101 | awk -F/" '{print $2}'` 
#Targey[wy1_IO]: memTotalReal.0&memAvailReal.0:holdata@holdata.3322.org 
Xsize[wy1_IO]: 300 
Ysize[wy1_IO]: 100 
Ytics[wy1_IO]: 7 
MaxBytes[wy1_IO]: 10000 
Title[wy1_IO]: DISK IO State of WY1 IP 192.168.13.103 Server 
PageTop[wy1_IO]:<H1>DISK IO State of WY1 IP 192.168.13.103 Server</H1> 
ShortLegend[wy1_IO]:  
kmg[wy1_IO]: K/s,M/s 
kilo[wy1_IO]:1024 
YLegend[wy1_IO]: DISK IO SPEED 
Legend1[wy1_IO]: IO 速度 : 
Legend2[wy1_IO]: IO 速度 : 
LegendI[wy1_IO]: IO 速度 : 
LegendO[wy1_IO]: IO 速度 : 
Options[wy1_IO]: growright,gauge,nopercent

用 indexmaker -o  /home/httpd/mrtg/103/index.html  /home/httpd/mrtg/103/mrtg.cfg   生成网页,在 crontab  中加入 */5 * * * * mrtg /home/httpd/mrtg/103/mrtg.cfg   
OK , 这样我们就能通过 mrtg 生成的图来监控我们 linux 的机器的状态了。在 IE 中打入 http: //192.168.13.105/mrtg/103,mrtg 的监控网页就出来啦
( /home/httpd/ 是我 appache 的主目录)。当然我们也 能用 snmpwalk 命令来得到安装有 snmp 服务的 win2000机器的状态的数据: 
如:

[root@wy1 103]# snmpwalk -v 1 192.168.1.5 -c public HOST-RESOURCES-MIB::hrStorage     
HOST-RESOURCES-MIB::hrMemorySize.0 = INTEGER: 3800424 KBytes 
HOST-RESOURCES-MIB::hrStorageIndex.1 = INTEGER: 1 
HOST-RESOURCES-MIB::hrStorageIndex.2 = INTEGER: 2 
HOST-RESOURCES-MIB::hrStorageIndex.3 = INTEGER: 3 
HOST-RESOURCES-MIB::hrStorageIndex.4 = INTEGER: 4 
HOST-RESOURCES-MIB::hrStorageIndex.5 = INTEGER: 5 
HOST-RESOURCES-MIB::hrStorageIndex.6 = INTEGER: 6 
HOST-RESOURCES-MIB::hrStorageType.1 = OID: HOST-RESOURCES-TYPES::hrStorageRemovableDisk 
HOST-RESOURCES-MIB::hrStorageType.2 = OID: HOST-RESOURCES-TYPES::hrStorageFixedDisk 
HOST-RESOURCES-MIB::hrStorageType.3 = OID: HOST-RESOURCES-TYPES::hrStorageFixedDisk 
HOST-RESOURCES-MIB::hrStorageType.4 = OID: HOST-RESOURCES-TYPES::hrStorageFixedDisk 
HOST-RESOURCES-MIB::hrStorageType.5 = OID: HOST-RESOURCES-TYPES::hrStorageCompactDisc 
HOST-RESOURCES-MIB::hrStorageType.6 = OID: HOST-RESOURCES-TYPES::hrStorageVirtualMemory 
HOST-RESOURCES-MIB::hrStorageDescr.1 = STRING: A:/ 
HOST-RESOURCES-MIB::hrStorageDescr.2 = STRING: C:/ Label:  Serial Number 581e89fe 
HOST-RESOURCES-MIB::hrStorageDescr.3 = STRING: D:/ Label:New Volume  Serial Number 1cde6e55 
HOST-RESOURCES-MIB::hrStorageDescr.4 = STRING: E:/ Label:DATA_BAK  Serial Number 30d29147 
HOST-RESOURCES-MIB::hrStorageDescr.5 = STRING: F:/ 
HOST-RESOURCES-MIB::hrStorageDescr.6 = STRING: Virtual Memory 
HOST-RESOURCES-MIB::hrStorageAllocationUnits.1 = INTEGER: 0 Bytes 
HOST-RESOURCES-MIB::hrStorageAllocationUnits.2 = INTEGER: 4096 Bytes 
HOST-RESOURCES-MIB::hrStorageAllocationUnits.3 = INTEGER: 4096 Bytes 
HOST-RESOURCES-MIB::hrStorageAllocationUnits.4 = INTEGER: 4096 Bytes 
HOST-RESOURCES-MIB::hrStorageAllocationUnits.5 = INTEGER: 0 Bytes 
HOST-RESOURCES-MIB::hrStorageAllocationUnits.6 = INTEGER: 65536 Bytes 
HOST-RESOURCES-MIB::hrStorageSize.1 = INTEGER: 0 
HOST-RESOURCES-MIB::hrStorageSize.2 = INTEGER: 2050287 
HOST-RESOURCES-MIB::hrStorageSize.3 = INTEGER: 15703529 
HOST-RESOURCES-MIB::hrStorageSize.4 = INTEGER: 53263499 
HOST-RESOURCES-MIB::hrStorageSize.5 = INTEGER: 0 
HOST-RESOURCES-MIB::hrStorageSize.6 = INTEGER: 89444 
HOST-RESOURCES-MIB::hrStorageUsed.1 = INTEGER: 0 
HOST-RESOURCES-MIB::hrStorageUsed.2 = INTEGER: 1233681 
HOST-RESOURCES-MIB::hrStorageUsed.3 = INTEGER: 591593 
HOST-RESOURCES-MIB::hrStorageUsed.4 = INTEGER: 23583930 
HOST-RESOURCES-MIB::hrStorageUsed.5 = INTEGER: 0 
HOST-RESOURCES-MIB::hrStorageUsed.6 = INTEGER: 50611 
HOST-RESOURCES-MIB::hrStorageAllocationFailures.1 = Counter32: 0 
HOST-RESOURCES-MIB::hrStorageAllocationFailures.2 = Counter32: 0 
HOST-RESOURCES-MIB::hrStorageAllocationFailures.3 = Counter32: 0 
HOST-RESOURCES-MIB::hrStorageAllocationFailures.4 = Counter32: 0 
HOST-RESOURCES-MIB::hrStorageAllocationFailures.5 = Counter32: 0 
HOST-RESOURCES-MIB::hrStorageAllocationFailures.6 = Counter32: 0 
上面显示的是 192.168.1.5 这台 win2000SERVER 的磁盘信息,可以看到盘符、每个分区的空间总量、使用量等。其它的相应建值还有: 
Diskused:                                 HOST-RESOURCES-MIB::hrStorageUsed 
CPU:                                    HOST-RESOURCES-MIB::hrProcessorLoad 
RUN Proc:                               HOST-RESOURCES-MIB::hrSWRunName 
SYS Uptime:                             HOST-RESOURCES-MIB::hrSystemUptime SNMPv2-MIB::sysUpTime 
SYS Date:                               HOST-RESOURCES-MIB::hrSystemDate 
SYS Device:                             HOST-RESOURCES-MIB::hrDeviceDescr 
SYS Descr:                              SNMPv2-MIB::sysDescr 
SYS Name:                               SNMPv2-MIB::sysName 
netcard speed:                          IF-MIB::ifSpeed 
netcard physcal address:                IF-MIB::ifPhysAddress 
这样我们就可以用一台 linux 主机通过 snmp+mrtg 来监控多台局域网内的 linux/win2000SERVER 了:)。 
现在我最关心的是如何让 snmp 包穿过防火墙,(我用 snmpwalk 试了一下,抓不到公司在 IDC 防火墙后的SERVER 的 snmp 数据)。

Linux下的snmpd.conf配置说明的更多相关文章

  1. Linux下/etc/resolv.conf 配置DNS客户

    文件/etc/resolv.conf配置DNS客户,它包含了主机的域名搜索顺序和DNS服务器的地址,每一行应包含一个关键字和一个或多个的由空格隔开的参数.下面是一个例子文件: search mydom ...

  2. Linux下/etc/resolv.conf 会被重新写入

    主要原因是因为安装了network manager,所以在启动后每次都会重写这个文件. 所以需要在network manager->eth0->ipv4->Automatic(DHC ...

  3. linux下Postgresql-9.2安装及数据库的创建过程

    公司写部署手册需要,现总结一些linux下postgresql的安装及数据库创建的详细步骤吧! 1.1.1  软件安装   1.设置用户组和用户级别 Postgresql不能以root身份运行,要以其 ...

  4. Linux下的sudo及其配置文件/etc/sudoers的详细配置说明

    http://www.osedu.net/article/linux/2011-01-03/178.html Linux下的sudo及其配置文件/etc/sudoers的详细配置说明 1.sudo介绍 ...

  5. Linux下hosts、host.conf、resolv.conf

    /etc/resolv.conf 该文件是DNS域名解析的配置文件,它的格式很简单,每行以一个关键字开头,后接配置参数. resolv.conf的关键字主要有四个,分别是: nameserver   ...

  6. VMware Linux 下 Nginx 安装配置 - nginx.conf 配置 [负载两个 Tomcat] (三)

    首先启动Nginx 1. 相关浏览 两个 Tomcat 配置:  VMware Linux 下 Nginx 安装配置 - Tomcat 配置 (二) Nginx 安装配置启动: VMware Linu ...

  7. Linux下hosts、host.conf、resolv.conf的区别

    /etc/resolv.conf 该文件是DNS域名解析的配置文件,它的格式很简单,每行以一个关键字开头,后接配置参数.resolv.conf的关键字主要有四个,分别是:nameserver   #定 ...

  8. linux下编译qt5.6.0静态库(使用./configure --help来看看都有哪些参数。超详细,有每一个模块的说明。如果改变了安装的目录,需要到安装目录下的bin目录下创建文件qt.conf)(乌合之众)good

    linux下编译qt5.6.0静态库 linux下编译qt5.6.0静态库 configure生成makefile 安装选项 Configure选项 第三方库: 附加选项: QNX/Blackberr ...

  9. 【Linux】snmp在message中报错: /etc/snmp/snmpd.conf: line 311: Error: ERROR: This output format has been de

    Apr 17 17:36:17 localhost snmpd[2810]: /etc/snmp/snmpd.conf: line 311: Error: ERROR: This output for ...

随机推荐

  1. 【刷题】BZOJ 1924 [Sdoi2010]所驼门王的宝藏

    Description Input 第一行给出三个正整数 N, R, C. 以下 N 行,每行给出一扇传送门的信息,包含三个正整数xi, yi, Ti,表示该传送门设在位于第 xi行第yi列的藏宝宫室 ...

  2. 【刷题】LOJ 6010 「网络流 24 题」数字梯形

    题目描述 给定一个由 \(n\) 行数字组成的数字梯形如下图所示.梯形的第一行有 \(m\) 个数字.从梯形的顶部的 \(m\) 个数字开始,在每个数字处可以沿左下或右下方向移动,形成一条从梯形的顶至 ...

  3. 洛谷P3380 【模板】二逼平衡树(树套树,树状数组,线段树)

    洛谷题目传送门 emm...题目名写了个平衡树,但是这道题的理论复杂度最优解应该还是树状数组套值域线段树吧. 就像dynamic ranking那样(蒟蒻的Sol,放一个link骗访问量233) 所有 ...

  4. GO进程调度相关源码学习

    启动流程 procresize流程 malloc.go Memory allocator sizeclass.go span按大小区分的 类型定义 mbitmap.go type and heap b ...

  5. 【转】如何学习android开发

    1.Java基础 很多朋友一上手就开始学习Android,似乎太着急了一些.Android应用程序开发是以Java语言为基础的,所以没有扎实的Java基础知识,只 是机械的照抄别人的代码,是没有任何意 ...

  6. mybatis的面试一对一,一对多,多对多的mapper.xml配置

    使用springboot完成一对一,一对多: https://blog.csdn.net/KingBoyWorld/article/details/78966789 传统的mapper文件中的一对一, ...

  7. webpack快速入门——CSS进阶:自动处理CSS3前缀

    为了浏览器的兼容性,有时候我们必须加入-webkit,-ms,-o,-moz这些前缀.目的就是让我们写的页面在每个浏览器中都可以顺利运行. 1.安装 cnpm i postcss-loader aut ...

  8. centos下安装python3.6.2

    一.下载 官网地址:https://www.python.org/downloads/source/ 我下载的是最新的3.6.2rc版本 # cd /opt/ wget https://www.pyt ...

  9. 转---一文读懂 python 的元类

    译注:这是一篇在Stack overflow上很热的帖子.提问者自称已经掌握了有关Python OOP编程中的各种概念,但始终觉得元类(metaclass)难以理解.他知道这肯定和自省有关,但仍然觉得 ...

  10. html5 canvas旋转

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...