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