ssh_connection
ssh_connection
模块
ssh_connection
模块摘要
该模块提供API函数,将SSH连接协议事件发送到SSH通道的另一端。
描述
在SSH Connection Protocol
所使用的客户机和服务器,即,SSH通道,过SSH连接进行通信。该模块中的API函数发送SSH连接协议事件,这些事件通过远程通道作为消息接收。如果接收通道是Erlang进程,则消息具有格式{ssh_cm, ssh_connection_ref(), ssh_event_msg()}
。如果ssh_channel
行为用于实现通道处理,则这些消息由处理handle_ssh_msg/2
。
数据类型
在此模块中多次使用的类型定义,或抽象表示数据类型的预期用途,或两者:
boolean() =
true | false
string() =
ASCII字符列表
timeout() =
infinity | integer()
以毫秒为单位
ssh_connection_ref() =
opaque() - 由ssh:connect/3
SSH通道进程返回或发送到该进程
ssh_channel_id() =
integer()
ssh_data_type_code() =
1
(“stderr”)| 0
(“正常”)是有效值,请参见RFC 4254
第5.2节。
ssh_request_status() =
success | failure
event() =
{ssh_cm, ssh_connection_ref(), ssh_event_msg()}
ssh_event_msg() =
data_events() | status_events() | terminal_events()
reason() =
timeout | closed
data_events()**
{data, ssh_channel_id(), ssh_data_type_code(), Data :: binary()}
**
数据已经抵达频道。此事件是作为调用的结果发送的ssh_connection:send/[3,4,5]
。
{eof, ssh_channel_id()}
表示对方不再发送数据。此事件是作为调用的结果发送的ssh_connection:send_eof/2
。
status_events()**
{signal, ssh_channel_id(), ssh_signal()}
**
使用以下消息可以将信号传递到远程过程/服务。某些系统不支持信号,在这种情况下,他们将忽略此信息。目前没有函数可以产生这个事件,因为所涉及的信号是在OS级而不是由Erlang程序产生的。
{exit_signal, ssh_channel_id(), ExitSignal :: string(), ErrorMsg ::string(), LanguageString :: string()}
由于信号,远程执行可能会强烈终止。然后可以收到此消息。有关有效字符串值的详细信息,请参见RFC 4254
第6.10节,其中显示了这些信号的特例。
{exit_status, ssh_channel_id(), ExitStatus :: integer()}
当在另一端运行的命令终止时,可以发送以下消息来返回命令的退出状态。零exit_status
通常意味着命令成功终止。此事件是作为调用的结果发送的ssh_connection:exit_status/3
。
{closed, ssh_channel_id()}
此事件是作为调用的结果发送的ssh_connection:close/2
。这个事件的处理和发送都由该ssh_channel
行为来处理。
terminal_events()
在服务器端实现shell和命令执行的通道是处理客户端通道进程可以发送的以下消息。
包含WantReply
期望事件处理过程以ssh_connection:reply_request/4
布尔值WantReply
作为第二个参数调用的事件。
{env, ssh_channel_id(), WantReply :: boolean(), Var ::string(), Value :: string()}
环境变量可以传递给shell /命令以便稍后启动。此事件是作为调用的结果发送的ssh_connection:setenv/5
。
{pty, ssh_channel_id(), WantReply :: boolean(), {Terminal :: string(), CharWidth :: integer(), RowHeight :: integer(), PixelWidth :: integer(), PixelHeight :: integer(), TerminalModes :: [{Opcode :: atom() | integer(), Value :: integer()}]}}
该会议已请求伪终端。 终端是TERM环境变量值的值,即vt100。 零维参数必须被忽略。 字符/行的尺寸覆盖像素尺寸(当非零时)。 像素尺寸是指窗口的可绘制区域。 TerminalModes列表中的操作码是助记符的名称,表示为RFC 4254第8部分定义的小写Erlang原子。如果助记符名称未在RFC中列出,它也可以是操作码。 例如:OP代码:53,助记符名称ECHO erlang atom:echo。 此事件是由于调用ssh_connection:ptty_alloc / 4而发送的。
{shell, WantReply :: boolean()}
该消息要求用户默认的shell在另一端启动。此事件是作为调用的结果发送的ssh_connection:shell/2
。
{window_change, ssh_channel_id(), CharWidth() :: integer(), RowHeight :: integer(), PixWidth :: integer(), PixHeight :: integer()}
当客户端的窗口(终端)大小发生变化时,它可以
向服务器端发送一条消息,通知它新的维度。没有API函数生成此事件。
{exec, ssh_channel_id(), WantReply :: boolean(), Cmd :: string()}
该消息请求服务器开始执行给定的命令。此事件是作为调用ssh_connection:exec/4
的结果发送的
输出
adjust_window(ConnectionRef, ChannelId, NumOfBytes) -> ok
类型
调整SSH流控制窗口。这将由客户端和服务器端通道进程来完成。
注
实现的通道。ssh_channel
行为通常不需要调用此函数,因为流控制是由行为处理的。每次回调时,行为都会调整窗口。handle_ssh_msg/2
处理通道数据后返回。
close(ConnectionRef, ChannelId) -> ok
类型
服务器或客户端通道进程可以通过发送关闭事件来选择关闭会话。
注
此函数由ssh_channel
终止通道时的行为,请参见ssh_channel(3)
因此,使用此行为实现的通道不显式调用此函数。
exec(ConnectionRef, ChannelId, Command, TimeOut) -> ssh_request_status() | {error, reason()}
类型
由客户端通道进程调用,请求服务器开始执行给定的命令。结果是按照以下模式发送多条消息。最后一条消息是通道关闭消息,因为exec
请求是一次执行,在完成时关闭通道。
N x {ssh_cm, ssh_connection_ref(), {data, ssh_channel_id(), ssh_data_type_code(), Data :: binary()}}
根据命令的不同,执行命令的结果只能是一行或数千行。
0 or 1 x {ssh_cm, ssh_connection_ref(), {eof, ssh_channel_id()}}
指示不再发送数据。
0 or 1 x {ssh_cm, ssh_connection_ref(), {exit_signal, ssh_channel_id(), ExitSignal :: string(), ErrorMsg :: string(), LanguageString :: string()}}
不是所有的系统都发送信号。有关有效字符串值的详细信息,请参阅rfc 4254,第6.10节。
0 or 1 x {ssh_cm, ssh_connection_ref(), {exit_status, ssh_channel_id(), ExitStatus :: integer()}}
SSH连接协议建议发送此消息,但情况并不总是这样。
1 x {ssh_cm, ssh_connection_ref(), {closed, ssh_channel_id()}}
指示ssh_channel
开始执行的命令现在已经关闭。
exit_status(ConnectionRef, ChannelId, Status) -> ok
类型
由服务器通道进程调用,以便将命令的退出状态发送到客户端。
ptty_alloc(ConnectionRef, ChannelId, Options) ->ptty_alloc(ConnectionRef, ChannelId, Options, Timeout) -> > ssh_request_status() | {error, reason()}
类型
发送一个SSH连接协议pty_req
,分配一个伪终端。将由SSH客户端进程调用。
备选方案:
{term, string()}
默认为os:getenv(“TERM”)
,如果未定义,则为vt100
。
{width, integer()}
默认为80,如果pixel_width
没有定义。
{height, integer()}
默认为24,如果pixel_height
没有定义。
{pixel_width, integer()}
被忽略,如果width
被定义。
{pixel_height, integer()}
被忽略,如果height
被定义。
{pty_opts, {posix_atom(), integer()}}
选项可以是一个空列表。否则,请参阅第8节中的可能的POSIX
名称。 RFC 4254
reply_request(ConnectionRef, WantReply, Status, ChannelId) -> ok
类型
发送状态回复给请求者声明它想要状态报告的请求,也就是说WantReply = true
。如果WantReply
是false
,调用这个函数成为“noop”。在处理包含WantReply
布尔值的SSH连接协议消息时要被调用。
send(ConnectionRef, ChannelId, Data) ->send(ConnectionRef, ChannelId, Data, Timeout) ->send(ConnectionRef, ChannelId, Type, Data) ->send(ConnectionRef, ChannelId, Type, Data, TimeOut) -> ok | {error, timeout} | {error, closed}
类型
由客户端和服务器通道进程调用,以便相互发送数据。
函数subsystem/4
和随后的调用send/3,4,5
必须在同一个进程中执行。
send_eof(ConnectionRef, ChannelId) -> ok | {error, closed}
类型
在信道上发送EOFChannelId
...
session_channel(ConnectionRef, Timeout) ->session_channel(ConnectionRef, InitialWindowSize, MaxPacketSize, Timeout) -> {ok, ssh_channel_id()} | {error, reason()}
类型
打开SSH会话的通道。从该函数返回的通道id是用作此模块中其他函数的输入的id。
setenv(ConnectionRef, ChannelId, Var, Value, TimeOut) -> ssh_request_status() | {error, reason()}
类型
可以在启动shell/命令之前传递环境变量。由客户端通道进程调用。
shell(ConnectionRef, ChannelId) -> ssh_request_status() | {error, closed}
类型
由客户端通道进程调用,以请求在服务器端执行用户默认shell(通常在Unix系统的/ etc / passwd中定义)。
subsystem(ConnectionRef, ChannelId, Subsystem, Timeout) -> ssh_request_status() | {error, reason()}
类型
由客户端通道进程调用,用于请求在服务器上执行预定义的子系统。
函数subsystem/4
和随后的调用send/3,4,5
必须在同一个进程中执行。