[翻译]Paramiko之Server implementation

Paramiko官方文档-Server
ServerInterface is an interface to override for server support.
Paramiko的ServerInterface是用来重写Paramiko服务端支持的接口。

class paramiko.server.ServerInterface

这个类定义了一个在服务端控制paramiko所有行为的接口,这个类的方法是在Paramiko主线程下调用的,所以,你不应该在这些方法中做太多的工作(一定不能去阻塞或者睡眠)。

check_channel_request(kind, chanid):

这个方法决定一个指定类型的通道请求是否被允许,将会返回OPEN_SUCCEEDED或者其他错误码。当客户端完成身份认证并请求通道时,该方法在服务端被调用。

当你允许通道请求的时候(当然如果不允许就无法使用),你同样应该重写下面这些通道请求方法,这些方法用于确定给定的通道将授权哪些服务。

  • check_channel_pty_request
  • check_channel_shell_request
  • check_channel_subsystem_request
  • check_channel_window_change_request
  • check_channel_x11_request
  • check_channel_forward_agent_request

chanid参数是一个小的数字,用来唯一标识传输中的通道。除非该方法返回OPEN_SUCCEEDED否则通道对象将不会被创建,一旦通道被创建,你就可以调用Channel.get_id方法来获取这个通道的ID。

该方法的返回值应该是OPEN_SUCCEEDED (or 0)来允许通道请求,或者返回下面的错误码中的一个来拒绝通道请求。

  • OPEN_FAILED_ADMINISTRATIVELY_PROHIBITED
  • OPEN_FAILED_CONNECT_FAILED
  • OPEN_FAILED_UNKNOWN_CHANNEL_TYPE
  • OPEN_FAILED_RESOURCE_SHORTAGE

该方法默认返回OPEN_FAILED_ADMINISTRATIVELY_PROHIBITED

check_channel_pty_request(channel, term, width, height, pixelwidth, pixelheight, modes):

确定在伪终端上是否可以在指定通道上提供指定尺寸(通常为shell访问而请求)。默认值为False。

check_channel_shell_request(channel):

确定在伪终端上是否可以提供shell给客户端。如果返回True,通道将会连接到shell的stdin/stdout(或者类似shell的东西)。默认返回False。

check_channel_exec_request(channel, command):

确定是否要为客户端执行一个shell命令。如果返回True,该通道应该连接到shell命令的stdin/stdout/stderror。默认返回False。

check_channel_subsystem_request(channel, name):

确定是否要为通道上的客户端提供子系统请求。如果返回True,将会认为该通道后面所有的I/O都会连接到同一个请求的子系统。例如sftp子系统。

默认通过Transport.set_subsystem_handler处理程序来实现子系统的检测操作,如果一旦被设置,将会调用该处理程序并且该方法返回True,其他情况将会返回False。

注意:
应为默认的实现使用Transport来标识有效的子系统,所以你可能不需要重写此方法。

check_channel_window_change_request(channel, width, height, pixelwidth, pixelheight):

确定指定的通道上的伪终端是否可以调整大小,当然,这只有在之前为它分配了pty才会生效。默认返回False。

check_channel_x11_request(channel, single_connection, auth_protocol, auth_cookie, screen_number):

确定是否为客户端提供一个X11会话。如果返回True,将会通过Transport.open_x11_channel让X11应用程序使用新的SSH通道。默认返回False。

check_channel_forward_agent_request(channel):

确定是否为客户端提供一个转发代理会话。如果返回True,服务端将会允许SSH代理转发。默认返回False。

check_channel_direct_tcpip_request(chanid, origin, destination):

确定本地端口转发通道是否被授权,该方法将会返回OPEN_SUCCEEDED或者其他错误码。完成身份证人之后,当有客户端请求时该方法将会调用。

默认返回OPEN_FAILED_ADMINISTRATIVELY_PROHIBITED。

check_channel_env_request(channel, name, value):

检查通道是否要指定一个环境变量。如果服务端将要指定一个环境变量,该方法应该返回True。注意有些环境变量被设置将会很危险,所以不要盲目的允许客户端设置环境变量。默认返回False。

get_allowed_auths(username):

返回一个服务端所支持的身份认证方法的列表。这个列表发送给试图进行认证的客户端,通知客户端成功通过身份认证的方法。
实际上,这个列表是以逗号(,)分割的身份认证类型的名字的列表。值通常为"password", "publickey"或"None"。默认是"password"。

check_auth_none(username):

确定客户端可以在无认证的情况下打开通道。如果必须身份认证请返回AUTH_FAILED,允许不需要认证请返回AUTH_SUCCESSFUL。默认返回AUTH_FAILED。

check_auth_password(username, password):

确定需要用户名和密码建立通道。密码认证失败返回AUTH_FAILED,密码认证通过并且完成身份认证时返回AUTH_SUCCESSFUL,如果是有状态的认证返回AUTH_PARTIALLY_SUCCESSFUL,这个值用于身份认证,但是需要提供更多的信息(该情况下将会调用get_allowed_auths允许的选项让通知客户端继续认证)。

默认返回AUTH_FAILED。

check_auth_publickey(username, key):

确定是否接受客户端通过KEY来认证,如果是,你需要重写该方法来检测用户名和KEY,同时要确定你是否接受该KEY产生的签名。默认返回AUTH_FAILED。

注意:你不要完成签名验证的工作,如果你接受这个KEY,那么Paramiko将会替你完成这些验证。

check_auth_interactive(username, submethods):

如果支持该方法,那么将会进行人机交互认证。如果你想要支持"keyboard-interactive"类型的认证,你需要提出一系列的问题让客户端回复。

如果不支持则返回AUTH_FAILED,否则,你应该返回给用户一个包含提示和说明的 InteractiveQuery对象。响应结果将会通过调用check_auth_interactive_response方法来发送。

默认返回AUTH_FAILED。

check_auth_interactive_response(responses):

如果支持的话,将会继续或者完成一个人机交互认证。如果你的服务端支持"keyboard-interactive"的认证类型,你应该重写该方法。

如果你想要通过更多问题继续进行人机交互认证,你应该返回一个InteractiveQuery对象,将会告诉客户端回答更多问题,然后会继续调用该方法。这个过程可以一直执行下去。

默认返回AUTH_FAILED。

check_auth_gssapi_with_mic(username, gss_authenticated=2, cc_file=None):

为服务端认证给出的krb5主体的用户。(kerberos认证)

check_auth_gssapi_keyex(username, gss_authenticated=2, cc_file=None):

如果给定的用户是一个有效的krb5主体,则向服务器进行身份验证,并执行GSS-API密钥交换。如果没有执行GSS-API密钥交换,则此身份验证方法将不可用。

enable_auth_gssapi():

重写该方法开启GSSAPI认证。默认False。

check_port_forward_request(address, port):

处理一个端口转发请求。客户端请求这个SSH连接转发到指定的地址和端口上。0.0.0.0表示全局地址,0表示任意端口(通常客户端会随机选择一个端口)。

默认返回False拒绝。如果允许,应该返回所监听的端口。

cancel_port_forward_request(address, port):

取消之前设置的端口转发请求。

check_global_request(kind, msg):

处理给定类型的全局请求。在服务器模式和客户端模式下,只要远程主机发出全局请求,就会调用此方法。如果请求有任何参数,它们将在msg中。除了端口转发,没有定义任何有用的全局请求,所以通常这种类型的请求是协议的扩展。

如果请求成功,并且希望将上下文数据返回到远程主机,则返回一个元组。元组中的项将随着成功的结果被发回。(注意,元组中的项只能是字符串、整型、长型或bool型。)

默认实现总是返回False,表示它不支持任何全局请求。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,270评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,489评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,630评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,906评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,928评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,718评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,442评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,345评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,802评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,984评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,117评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,810评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,462评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,011评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,139评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,377评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,060评论 2 355

推荐阅读更多精彩内容