2013年5月

python监听端口

监听tcp协议的端口包

#!/usr/bin/python

import socket

HOST = 'localhost'   # use '' to expose to all networks
PORT = 515

def incoming(host, port):
    """Open specified port and return file-like object"""
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    sock.bind((host, port))
    sock.listen(0)
    request, addr = sock.accept()
    return request.makefile('r', 0)

for line in incoming(HOST, PORT):
    print line,

监听udp协议的端口包

#!/usr/bin/python

# receive udp packets from all interfaces

import socket

HOST = ''   # use '' to expose to all networks
port = 515

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind((HOST, port))

try:
    while True:
            data, addr = s.recvfrom(4096)
            back = 'Your address is %r\n' % (addr,)
            print data
except KeyboardInterrupt:
    print()

python json

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解

析和生成。json默认应该是在python 2.6以上。

对简单数据类型的encoding 和 decoding:

使用简单的json.dumps方法对简单数据类型进行编码,例如:

[python]
import json

obj = [[1,2,3],123,123.123,'abc',{'key1':(1,2,3),'key2':(4,5,6)}]
encodedjson = json.dumps(obj)
print repr(obj)
print encodedjson
[/python]

输出:

[python]
[[1, 2, 3], 123, 123.123, 'abc', {'key2': (4, 5, 6), 'key1': (1, 2, 3)}]
[[1, 2, 3], 123, 123.123, "abc", {"key2": [4, 5, 6], "key1": [1, 2, 3]}]
[/python]

json decoding

[python]
decodejson = json.loads(encodedjson)
[/python]

问题


[python]
>>> str = '["hello\"world","hello\"world"]'
>>> json.loads(str)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/json/__init__.py", line 326, in loads
return _default_decoder.decode(s)
File "/usr/lib/python2.7/json/decoder.py", line 366, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/lib/python2.7/json/decoder.py", line 382, in raw_decode
obj, end = self.scan_once(s, idx)
ValueError: Expecting , delimiter: line 1 column 8 (char 8)
>>> print str
["hello"world","hello"world"]
[/python]

问题就是出现在上面,用反斜杆转义了双引号,结果赋值的时候 str 的结构就变了,json就没法识别了,所

以只能用双斜杆,

[python]
>>> str = '["hello\\"world","hello\\"world"]'
>>> json.loads(str)
[u'hello"world', u'hello"world']
>>> print str
["hello\"world","hello\"world"
[/python]

原本是想用json先将日志格式化之后,通过syslog-ng传递到另外机器上,syslog-ng对接的是管道,从管道

里用 read 命令读取的到变量里面,因为 read 命令其实就是一个变量赋值的过程,所以赋值过程中的单斜

干都被shell吃了,解决方案就是要么换成双斜杆,不过这吃力不讨好,最好的办法呢? read 命令加个参

数 "-r",这样read就做变量赋值的时候就会屏蔽所有的反斜杆。

python paramiko模块安装和使用

简介


大家会发现,常见的解决方法都会需要对远程服务器必要的配置,如果远程服务器只有一两台还好说,如果有N台,还需要逐台进行配置,或者需要使用代码进行以上操作时,上面的办法就不太方便了。

使用paramiko可以很好的解决以上问题,比起前面的方法,它仅需要在本地上安装相应的软件(python以及PyCrypto),对远程服务器没有配置要求,对于连接多台服务器,进行复杂的连接操作特别有帮助。

- 阅读剩余部分 -