Archive for linux

只是为了保持和线上的环境一致,默认启动的用户是jenkins 修改/etc/default/jenkins配置文件 JENKINS_USER="sysop" JENKINS_GROUP="sysop" 更改jenkins目录权限

chown -R sysop:sysop /var/lib/jenkins 
chown -R sysop:sysop /var/cache/jenkins
chown -R sysop:sysop /var/log/jenkins


sudo /etc/init.d/jenkins restart
直接执行名利好像没反应,我重新启动虚拟机就好了

Continue

额 早就想写这么个脚本了。这次有点时间写了一下,借助shell下的工具和python还是可以很快写好。 发现总有人爆破我ssh密码,我修改了端口还是跑。是盯上了还是怎么。如果关闭密码登录会好,但是每次换电脑就要添加公key,感觉还是密码方便一点。

# coding: utf-8
import os
import time


def lo():
    ban_ip_list = []

    output = os.popen("""grep "Failed password for root" /var/log/auth.log | awk {'print $11'} | uniq -c | sort -rn""")
    for l in output.readlines():
        count, ip = l.split()
        if int(count) > 5 and ip not in ban_ip_list:
            ban_ip_list.append(ip)
    print ban_ip_list

    iptables_ban_ip_list = []
    output = os.popen("""iptables -L -n|grep "DROP" | awk {'print $4'} """)
    for l in output.readlines():
        iptables_ban_ip_list.append(l.split()[0])

    print iptables_ban_ip_list
    iplist = list(set(ban_ip_list) - set(iptables_ban_ip_list))
    print iplist
    for ip in iplist:
        os.popen("""iptables -I INPUT -s {} -j DROP """.format(ip))


#iptables -L -n --line-numbers
#iptables -D INPUT 8


while 1:
    lo()
    time.sleep(1)
    break
代码还可以改进,比如后边set了 前边就不用判断ip在不在列表里了。我是用服务器上另一个脚本用vim复制后按思路写的。功能跑通就不想改了。加入crontab搞定。 以后有时间改成只屏蔽10分钟,这样实用性就强一点了。想法就是要记录下错误时间,错误时间加十分钟就是解禁时间。

Continue

同事使用mtop监控mysql和redis,redis没有流量监控,然后我写个脚本集成到mtop里边。然后查了相关资料snmp。 发现线上n多的负值,不知道问题,我本地没有问题。我查了64位系统的流量累加没有上限,后来同事说可能snmp是32位的,汗。我在redis流量表中类似mtop的操作,保存临时值然后清除,移动到history表中,也看不到具体问题在哪。我也不能有线上权限,让同事查我看,大约知道在4000多M的时候出现负的,差不多应该上限是4g。然后判断 new-old<0,就new+4096-old,然后没出现负值了。

Continue

安装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