Archive for linux

安装snmp apt-get install snmp snmpd 编辑/etc/snmp/snmpd.conf配置文件, 1.将原有“agentAddress udp:127.0.0.1:161”改为: agentAddress 192.168.1.9 /*192.168.1.9为本机IP,即监控服务器要监控的主机IP*/ 2.加入一行如下: access MyROSystem "" any noauth exact all none none 3.将原有“rocommunity public default -V systemonly” 的"-V systemonly" 参数去掉,变成: rocommunity public default 4.将“#trap2sink localhost public”和“#informsink localhost public”前面的“#”去掉,改为: trap2sink localhost public informsink localhost public 5.重启SNMP服务: /etc/init.d/snmpd restart 6.检验snmp获取数据: snmpwalk -v 2c -c public 192.168.1.9 流量查询 snmpwalk -v 2c -c public 192.168.1.103 .1.3.6.1.2.1.2.2.1.16.2 send snmpwalk -v 2c -c public 192.168.1.103 .1.3.6.1.2.1.2.2.1.10.2 receive 查到的结果是总流量,需要取差值计算。 发现一篇好文章,http://www.freeoa.net/osuport/netmanage/get-host-net-traffice-info-by-snmp_1979.html 取得所有网/端口的描述 snmpwalk -v 2c -c public ipaddr ifDescr cisco交换机端口流量取值需要注意的问题: If interfaces are in trunk mode, you won't see them with that OID. CISCO-VLAN-MEMBERSHIP-MIB is only for non-trunking ports. You can try vlanTrunkPortDynamicStatus from CISCO-VTP-MIB to check. 得到机器的网络接口: snmpwalk -v 2c -c public 192.168.1.20 ifDescr or snmpwalk -v 2c -c public 192.168.1.20 .1.3.6.1.2.1.2.2.1.2 You should get a result like this: IF-MIB::ifDescr.1 = STRING: lo IF-MIB::ifDescr.2 = STRING: eth0 IF-MIB::ifDescr.3 = STRING: wifi0 IF-MIB::ifDescr.4 = STRING: ath0 IF-MIB::ifDescr.5 = STRING: br0 # snmpwalk -v1 -c public 192.168.1.20 ifDescr 取得网卡的进/出流量计数: # snmpwalk -v1 -c public 192.168.1.20 ifinOctets IF-MIB::ifInOctets.1 = Counter32: 0 IF-MIB::ifInOctets.2 = Counter32: 186740992 IF-MIB::ifInOctets.3 = Counter32: 4117381100 IF-MIB::ifInOctets.4 = Counter32: 3824919421 IF-MIB::ifInOctets.5 = Counter32: 569163 # snmpwalk -v1 -c public 192.168.1.20 ifoutOctets IF-MIB::ifOutOctets.1 = Counter32: 0 IF-MIB::ifOutOctets.2 = Counter32: 3824764209 IF-MIB::ifOutOctets.3 = Counter32: 305295003 IF-MIB::ifOutOctets.4 = Counter32: 168468497 IF-MIB::ifOutOctets.5 = Counter32: 172865 它们分别代表的意义 ifHCOutOctets OID 1.3.6.1.2.1.31.1.1.1.10 - outgoing traffic (bytes) ifHCInOctets OID 1.3.6.1.2.1.31.1.1.1.6 - incoming traffic (bytes) 取得交换机端口1的流量 statistic for port 1, then OID is: 1.3.6.1.2.1.31.1.1.1.10.1 使用SNMP RFC1213-mib定义进行流量分析 使用snmp管理网络设备,unix下常用net-snmp的snmpwalk,snmpget等,要得到网络的相关信息,可通过提取'RFC1213-mib'的定义值得到。例如:要取得远程主机的团体字为'public',IP为'192.168.1.20'的网络端口流入(IN)的数据流量,可以使用如下命令: snmpwalk -v 2c -c public 192.168.1.20 RFC1213-MIB::ifInOctets 返回各端口信息如下: IF-MIB::ifInOctets.112 = counter32:165070862 IF-MIB::ifInOctets是 rfc1213的定义端口流入数据量 112是查询网络设备的1模块插槽12端口 counter32后的数值就是该端口的流量:165070862 bits,在终端下可以通过shell命令取得这两个值 # 首先取得 12 接口的 ifIndex index=$(snmpwalk -v 2c -c public -IR 192.168.1.20 RFC1213-MIB::ifDescr |grep IF-MIB::ifInOctets.112 |cut -d ‘=’ -f 1|cut -d ‘.’ -f 2) # 再通过 snmp 协议取得 ififInOctets 和 ifOutOctets 的值 # 也可在 /etc/snmp.conf 中配置好'defVersion'和'defCommunity',这样 snmpget 命令不用指定这两个参数: eth12_in=$(snmpget -v 2c -c public -IR -Os 192.168.1.20 ifInOctets.${index}|cut -d ‘:’ -f 2|tr -d ‘[:blank:]‘) eth12_out=$(snmpget -v 2c -c public -IR -Os 192.168.1.20 ifOutOctets.${index}|cut -d ‘:’ -f 2 |tr -d ‘[:blank:]‘) echo $eth12_in echo $eth12_out 一般端口流量分析 针对普通网络设备的端口,MIB的相关定义是Interface组,主要管理如下信息: ifIndex 端口索引号 ifDescr 端口描述 ifType 端口类型 ifMtu 最大传输包字节数 ifSpeed 端口速度 ifPhysAddress 物理地址 ifOperStatus 操作状态 ifLastChange 上次状态更新时间 *ifInOctets 输入字节数 *ifInUcastPkts 输入非广播包数 *ifInNUcastPkts 输入广播包数 *ifInDiscards 输入包丢弃数 *ifInErrors 输入包错误数 *ifInUnknownProtos 输入未知协议包数 *ifOutOctets 输出字节数 *ifOutUcastPkts 输出非广播包数 *ifOutNUcastPkts 输出广播包数 *ifOutDiscards 输出包丢弃数 *ifOutErrors 输出包错误数 ifOutQLen 输出队长 其中,*号标识的是与网络流量有关的信息。 例如看看网络接口: #snmpwalk -v 1 222.90.47.169 -c public ifIndex 输出: IF-MIB::ifIndex.1 = INTEGER: 1 IF-MIB::ifIndex.2 = INTEGER: 2 IF-MIB::ifIndex.3 = INTEGER: 3 表示有三个网络接口 网络接口明成: [root@localhost snmp]# snmpwalk -v 1 222.90.47.169 -c public ifDescr IF-MIB::ifDescr.1 = STRING: lo IF-MIB::ifDescr.2 = STRING: eth0 IF-MIB::ifDescr.3 = STRING: ppp0 三个接口分别为 1 本地回路 2 以太网卡 3 ADSL连接 通过 snmp 协议取得 ififInOctets 和 ifOutOctets 的值 # snmpwalk -v1 -c public ipaddr ififInOctets/ifOutOctets 注意:端口的流量是一个累加值,即是从其加电工作开始到取数时,流经其的注意,因此这个数值是一直增加的。但受制于硬件的32位模式,处于32的系统下,这个值在超过4G后,会重新计数,64位系统没有这个限制。

Continue

开始想用python做一个键盘记录的工具,搜索linux keyboard hook,发现找不到东西。后来发现原来linux直接读设备文件就行了,才恍然大悟。 /dev/input/下有十多个event。要找到键盘对应的event,查看grep keyboard /proc/bus/input/devices -A 12。 然后找到一点资料,自己写了一段程序:

# coding: utf-8
import os
import struct

fmt = "llHHI"
size = struct.calcsize(fmt)
filename = "/dev/input/event3"

fd = os.open(filename, os.O_RDWR)
while 1:
    op = os.read(fd, size)
    timeval, suseconds, typ, code, value = struct.unpack(fmt, op)
    print typ, code, value
最后又找到两个库,用来读或模拟键盘按键的(或别的设备)。python-evdev和python-uinput。

Continue

好吧,我先把yin语言的java代码看了个差不多才想编译一下,主要原因还是想打印点测试的东西,并不是想写点什么。 总的来说像淫神说的,写得代码却是容易阅读。我java只是上学的时候开过课,再没用过,看的过程中只查了两三个的函数就看完了。看完了发现写个括号语言不算太难0 0,我的意思仅仅是学习知识不是编写一个可以用的语言。编译原理的课也开了,都是理论,传说中的龙书又是啥书的,我几分钟看来一遍,感觉和课本没什么区别。看一个编写初期的代码更容易理解一些东西。以前也想自己实现过,想想解析代码的复杂程度就怕了。 环境需求,参照github的wiki上。 java jdk 1.7,ubuntu12.04自带好像是openjdk 我以前搞安卓游戏的时候换过了。 maven 3.2 我直接从官网下载的二进制版本,http://maven.apache.org/download.cgi。解压到/opt/maven-3.2.1,vim /home/a0x55aa/.bashrc,添加export PATH=/opt/maven-3.2.1/apache-maven-3.2.1/bin:$PATH。source一下。mvn -version看一下。应该没问题了 然后mvn compile,自动下了一堆的东西0 0。pom.xml配置文件也看不懂。 mvn exec:java -Dexec.mainClass="org.yinwang.yin.Interpreter" -Dexec.args="tests/assign1.yin" 又下载了一堆东西。。。java果然不是一般人能搞的。我草。太恶心了,都不知道什么用。

Continue

早就想实现这么个功能,大部分不确定删除的时候,我都直接先移动到我用户的tmp目录下,这个目录我都放一些可删可不删的测试文件等。确定的我就直接删除。但是还有失误啥的,根本不可能预防所有情况。今天搜索一文章,正好实现。原理就是用一个新命令替换系统的rm命令。 原文http://www.webupd8.org/2010/02/make-rm-move-files-to-trash-instead-of.html。 1.sudo apt-get install trash-cli 原文有介绍这个工具,我也没用试试0 0。 2.sudo vim /usr/local/bin/trash-rm 文件内容

#!/bin/bash
# command name: trash-rm
shopt -s extglob
recursive=1
declare -a cmd
((i = 0))
for f in "$@"
do
case "$f" in
(-*([fiIv])r*([fiIv])|-*([fiIv])R*([fiIv]))
tmp="${f//[rR]/}"
if [ -n "$tmp" ]
then
#echo "\$tmp == $tmp"
cmd[$i]="$tmp"
((i++))
fi
recursive=0 ;;
(--recursive) recursive=0 ;;
(*)
if [ $recursive != 0   -a  -d "$f" ]
then
echo "skipping directory: $f"
continue
else
cmd[$i]="$f"
((i++))
fi ;;
esac
done
trash "${cmd[@]}"
12.04以上的版本,把最后一行的trash换成trash-put。 执行权限
sudo chmod +x /usr/local/bin/trash-rm

3.vim ~/.bashrc
替换命令,在文件最后添加
alias rm="trash-rm"
shell下执行bash,重载文件
搞定了。
 
http://www.webupd8.org/2010/02/make-rm-move-files-to-trash-instead-of.html

Continue

我要把mercurial-server的相关文件放到web项目里一起部署,于是想知道在apt-get安装mercurial-server时都执行了那些操作。官方没有手动安装的教程,我就查了整理一下。 开始找到这个命令,这个命令只会将一些安装的文件列出来,还有一些不知道什么用0 0.没有达到目的。 dpkg -x xxxx.deb xxxx 然后找到 ar vx xxxx.deb .deb其实是一个ar档,所以使用ar解压。 deb 包本身有三部分组成:数据包,包含实际安装的程序数据,文件名为 data.tar.XXX;安装信息及控制脚本包,包含 deb 的安装说明, 标识,脚本等,文件名为 control.tar.gz;最后一个是 deb 文件的一些二进制数据,包括文件头等信息,一般看不到,在某些软件中打开可 以看到。 control.tar.gz 则包含了一个 deb 安装的时候所需要的控制信息。一般有 5 个文件:control,用了记录软件标识,版本号,平 台,依赖信息等数据;preinst,在解包 data.tar.gz 前运行的脚本;postinst,在解包数据后运行的脚本;prerm,卸载时, 在删除文件之前运行的脚本;postrm,在删除文件之后运行的脚本。 搞定0 0. 参考: http://www.linuxdiyf.com/viewarticle.php?id=78628 http://www.baike.com/wiki/DEB%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F

Continue

在工作时服务器上环境的搭建,做个笔记记录。用到的东西主要有:django,nginx,supervisor,Gunicorn,virtualenv,mysql。 安装就略过了,每一个的文档上有介绍。virtualenv有一个virtualenvwrapper方便操作。 先安装virtualenv,然后在python虚拟环境里边安装django,gunicorn等相关库。 supervisor用来守护django网站启动的进程,默认配置文件添加/etc/supervisor/conf.d/name.conf

[program:code]
command=/home/sys/.virtualenvs/%(program_name)s/bin/gunicorn %(program_name)s.wsgi:application -c /home/www/%(program_name)s/%(program_name)s/gunicorn.conf.py
user=hg
directory=/home/www/%(program_name)s
autostart=true
autorestart=true
redirect_stderr=True
gunicorn.conf.py就是启动django的一些参数,制定监听的端口bind = "127.0.0.1:9006"。然后在nginx配置文件里边,进行转发。
server {
listen        80;
set $name "code";

server_name  code.xx.com;

root   /home/www/${name}/root;
access_log  /var/log/nginx/${name}.access.log;

location ~ (\.hg|\.orig|\.bak) {
deny all;
}

location /static/ {
expires max;
access_log off;
alias /home/www/${name}/static/;
}

location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass   http://127.0.0.1:9006;
}
}
supervisor的一些命令: 修改配置文件以后要使用supervisorctl update命令,否则不会更新。刚开始的时候,捣鼓了好长时间 才知道要这样搞0 0. supervisorctl start all启动所有进程, supervisorctl start code 单独启动code进程。 使用supervisorctl可以进入管理程序。

Continue

用ubuntu解压zip文件后一堆乱码, 1. 通过unzip行命令解压,指定字符集 unzip -O CP936 xxx.zip (用GBK, GB18030也可以)  

Continue

安装时没有安装桌面环境。 1.查看centos系统版本:命令lbs_release -a 2.mysql配置。 mysql从安装光盘中选择安装的。版本是5.0.77 修改/etc/my.cnf文件 default-character-set=utf8 [mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock user=mysql # Default to using old password format for compatibility with mysql 3.x # clients (those using the mysqlclient10 compatibility package). old_passwords=1 default-character-set=utf8 增加 [mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid [mysql] 增加 default-character-set=utf8 增加 没有密码登录时使用命令:mysql -u root 启动mysql服务:/etc/rc.d/init.d/mysqld start 设置密码 /usr/bin/mysqladmin -u root password '123456'   3.安装Apahce # yum -y install httpd php php-mysql 安装php的扩展 #yum -y install php-gd php-xml php-mbstring php-ldap php-pear php-xmlrpc 安装apache扩展 #yum -y install httpd-manual mod_ssl mod_perl mod_auth_mysql chkconfig httpd on [设置apache为自启动] service httpd start [启动 httpd 服务] apache配置出来的默认站点目录为/var/www/html/   4.测试 # vi /var/www/html/info.php <?php phpinfo(); ?> 命令行下输入:firefox,打开浏览器。输入http://127.0.0.1,可以显示欢迎界面,加上info.php,可以显示php的环境信息。    

Continue

我是在Ubuntu 10.04.3 LTS下安装的,简单介绍一下。 nmap安装命令:apt-get install nmap Metasploit安装命令: wget http://downloads.metasploit.com/data/releases/metasploit-latest-linux-installer.run chmod +x metasploit-latest-linux-installer.run ./metasploit-latest-linux-installer.run 一路回车就ok了。

Continue

昨天在群里聊天的时候,有一段时间没看聊天记录,只看到他们在讨论不知道root密码,su命令不能用。我就说了句为什么要su。直接sudo不久行了么。然后发给我个命令"sudo chmod -R 777 /usr",说是执行这个命令了,sudo不能用了 ,我也没多想,直接敲上试了下。我查,果然不行了 ,然后就到网上查了一下原因以及解决方法。记录如下: 1 开机grub引导页面,按esc 或者是 shift(我在这里试了五六次,组后是不停狂按两个键,才进去的),grub启动页面时间很短,但是现在不能执行sudo命令,时间也不能修改,只有狂按了。这是为了进入recovery mode(修复模式)。 2 进入recovery mode(修复模式)之后,选择recovery mode(修复模式)并回车,下一个界面选择boot,下边有命令提示终端,我直接在里面输入命令,搞定~ 3执行的命令,这个可以多种途径。网上直接是执行: chown root:root /usr/bin/sudo chmod 4755 usr/bin/sudo 我的方法是直接 passwd root ,修改密码。保证下次不用这么麻烦了。然后reboot,重启之后在su,切换到root下执行的命令。 4 为 SUID 2 为 SGID 1 为 SBIT SUID 权限仅对二进位程序(binary program)有效; 运行者对於该程序需要具有 x 的可运行权限; 本权限仅在运行该程序的过程中有效 (run-time); 运行者将具有该程序拥有者 (owner) 的权限。

Continue