gevent、argparse、和paramiko

来源:互联网 发布:手工制鞋 知乎 编辑:程序博客网 时间:2024/05/16 18:16

一、gevent

利用greenlet实现的基于协程的python网络库

使用gevent建立一个tcp服务器:

创建一个gevent.server.StreamServer实例,将服务器处理代理写入handle_echo函数,设置服务器地址和端口,最后启动服务器

from gevent import socketfrom gevent.server import StreamServerdef handle_echo(sock, address):  fp = sock.makefile()  while True:    line = fp.readline()    if line:        fp.write(line)        fp.flush()    else:        break  sock.shutdown(socket.SHUT_WR)    sock.close()
server = StreamServer(('', 1234), handle_echo)server.serve_forever()


预先设定监听套接字,取代('', 1234)

sock = socket.socket()sock.bind(('', 1234))sock.listen(256)server = StreamServer(sock, handle_echo)server.serve_forever()


ssh连接

通过使用gevent.ssl.socket创建一个提供加密的SSH监听套接字。

server = StreamServer(('', 1234), handle_echo,keyfile='server.key', certfile='server.crt')


二、参数解析器argparse

设置一个解析器

import argparseparser = argparse.ArgumentParser(description='This is a PyMOTW sample program')


定义参数 add_argument()


参数可以触发不同的动作,动作由 add_argument() 方法的 action 参数指定。 


支持的动作包括保存参数(逐个地,或者作为列表的一部分),当解析到某参数时保存一个常量值(包括对布尔开关真/假值的特殊处理),统计某个参数出现的次数,以及调用一个回调函数。

默认的动作是保存参数值。在这种情况下,如果提供一个类型,那么在存储之前会先把该参数值转换成该类型。如果提供 dest 参数,参数值就保存为命令行参数解析时返回的命名空间对象中名为该 dest 参数值的一个属性。

parser.add_argument('-a', action="store_true", default=False)parser.add_argument('-b', action="store", dest="b")parser.add_argument('-c', action="store", dest="c", type=int)

解析命令行 parse_args()


定义了所有参数之后,可以给 parse_args() 传递一组参数字符串来解析命令行。默认情况下,参数是从 sys.argv[1:] 中获取,但也可以传递自己的参数列表。选项是使用GNU/POSIX语法来处理的,所以在序列中选项和参数值可以混合。

parse_args() 的返回值是一个命名空间,包含传递给命令的参数。该对象将参数保存其属性,因此如果参数 dest 是 "myoption",那么可以args.myoption 来访问该值。

print parser.parse_args(['-a', '-bval', '-c', '3'])

有几种方式传递值给单字符选项。以上例子使用了两种不同的形式,-bval和-c val。
Namespace(a=True, b='val', c=3)
布尔型参数a,字符串型参数b,整数参数c

三、paramiko

python的paramiko模块提供了SSH2协议下的远程服务器机连接功能,支持加密和认证的方式。在本项目中,我主要关注它对服务器端的接口重构问题。

class paramiko.server.ServerInterface

ServerInterface类提供了对服务器端进行控制的接口。


check_auth_publickey(username, key)

该方法用来判定客户端是否符合认证。重载该方法来检查用户名和key。如果 key 不被接受返回 AUTH_FAILED,否则返回 AUTH_SUCCESSFUL。


check_channel_request(kind, chanid)
当客户认证完成后请求一个channel时,该方法在服务器中被调用。成功则返回 OPEN_SUCCEEDED,否则返回错误代码如下:

OPEN_FAILED_ADMINISTRATIVELY_PROHIBITED
OPEN_FAILED_CONNECT_FAILED
OPEN_FAILED_UNKNOWN_CHANNEL_TYPE
OPEN_FAILED_RESOURCE_SHORTAGE
默认情况下总是返回 OPEN_FAILED_ADMINISTRATIVELY_PROHIBITED

参数  kind (str) 客户端想打开的channel类型,一般为"session"

        chanid (int)  channel 的 id,只有在返回OPEN_SUCCEEDED后才会创建该 channel 对象,Channel.get_id 得到id号


get_allowed_auths(username)

该方法返回服务器认证的方法 list 。这个 list 是字符串,通常是 “password” "publickey" "none" 等 。默认返回 “password”

参数 username (str) 要求认证的用户名

0 0