美文网首页Paramiko
[翻译]Paramiko之Server implementati

[翻译]Paramiko之Server implementati

作者: 西北望高楼 | 来源:发表于2022-02-18 14:28 被阅读0次

    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,表示它不支持任何全局请求。

    相关文章

      网友评论

        本文标题:[翻译]Paramiko之Server implementati

        本文链接:https://www.haomeiwen.com/subject/cnkylrtx.html