查看源代码 ssh_connection (ssh v5.2.5)

此模块提供 API 函数,用于向 SSH 通道的另一端发送 SSH 连接协议事件。

SSH 连接协议 (RFC 4254) 由客户端和服务器(即 SSH 通道)使用,以通过 SSH 连接进行通信。此模块中的 API 函数发送 SSH 连接协议事件,这些事件作为消息被远程通道接收,处理远程通道。这些消息的 Erlang 格式为(另请参阅下文

{ssh_cm, ssh:connection_ref/0 , channel_msg/0 }

如果使用 ssh_client_channel 行为来实现通道进程,则这些消息由 handle_ssh_msg/2 处理。

概要

类型:通用

如引言所述,SSH 连接协议事件作为消息处理。当编写一个不使用 ssh_client_channel 行为支持的通道处理进程时,该进程必须处理这些消息。

包含 WantReply 的消息期望通道处理进程使用 WantReply 的布尔值作为第二个参数调用 ssh_connection:reply_request/4

类型:数据传输

数据已到达通道。此事件是调用 ssh_connection:send/3,4,5 的结果。

类型:关闭通道

此事件是调用 ssh_connection:close/2 的结果。此事件的处理和发送都由 ssh_client_channel 行为负责。

指示另一端不再发送数据。此事件是调用 ssh_connection:send_eof/2 的结果。

类型:伪终端

已为会话请求伪终端。Terminal 是 TERM 环境变量的值,即 vt100。必须忽略零维度参数。字符/行维度将覆盖像素维度(当非零时)。像素维度是指窗口的可绘制区域。TerminalModes 列表中的 Opcode 是助记名称,表示为小写的 Erlang 原子,在 RFC 4254 第 8 节中定义。如果助记名称未在 RFC 中列出,它也可以是 Opcode。例如:OP 代码:53,助记名称 ECHO Erlang 原子:echo。此事件是调用 ssh_connection:ptty_alloc/4 的结果。

类型:环境变量

环境变量可以传递给稍后启动的 shell/命令。此事件是调用 ssh_connection:setenv/5 的结果。

类型:Shell 或命令

此消息请求服务器开始执行给定的命令。此事件是调用 ssh_connection:exec/4 的结果。

此消息请求在另一端启动用户默认的 shell。此事件是调用 ssh_connection:shell/2 的结果。

类型:窗口更改

当客户端的窗口(终端)大小发生更改时,它可以向服务器端发送消息,告知其新的尺寸。没有 API 函数会生成此事件。

类型:信号

可以使用以下消息将信号传递给远程进程/服务。某些系统不支持信号,在这种情况下,它们将忽略此消息。目前没有函数生成此事件,因为所指的信号是在操作系统级别,而不是由 Erlang 程序生成的。

类型:退出状态

由于信号,远程执行可能会暴力终止。然后可以接收此消息。有关有效字符串值的详细信息,请参阅 RFC 4254 第 6.10 节,其中显示了这些信号的特殊情况。

当另一端运行的命令终止时,可以发送以下消息以返回命令的退出状态。零 exit_status 通常表示命令成功终止。此事件是调用 ssh_connection:exit_status/3 的结果。

类型

调用的结果。

请求的状态。对应于 RFC 4254 第 5.4 节中的 SSH_MSG_CHANNEL_SUCCESSSSH_MSG_CHANNEL_FAILURE 值。

有效值是 0(“正常”)和 1(“stderr”),请参阅 RFC 4254 第 5.2 节

函数

调整 SSH 流控制窗口。这应由客户端和服务器端的通道进程完成。

服务器或客户端通道进程可以选择通过发送关闭事件来关闭其会话。

由客户端通道进程调用,以请求服务器开始执行给定的命令。结果是根据以下模式的多个消息。最后一个消息是通道关闭消息,因为 exec 请求是一次性执行,在完成后会关闭通道。

由服务器通道进程调用,以将命令的退出状态发送到客户端。

发送 SSH 连接协议 pty_req,以分配伪终端。由 SSH 客户端进程调用。

向请求者已声明它需要状态报告(即 WantReply = true)的请求发送状态回复。如果 WantReplyfalse,则调用此函数将变为“空操作”。在处理包含 WantReply 布尔值的 SSH 连接协议消息时调用。

根据输入参数,等效于下面指定的 send/5 调用之一。

由客户端和服务器通道进程调用,以相互发送数据。

在通道 ChannelId 上发送 EOF。

为 SSH 会话打开通道。从此函数返回的通道 ID 是用作此模块中其他函数输入的 ID。

可以在启动 shell/命令之前传递环境变量。由客户端通道进程调用。

由客户端通道进程调用,以请求在服务器端执行用户默认的 shell(通常在 Unix 系统中的 /etc/passwd 中定义)。

由客户端通道进程调用,以请求在服务器上执行预定义的子系统。

类型:通用

如引言所述,SSH 连接协议事件作为消息处理。当编写一个不使用 ssh_client_channel 行为支持的通道处理进程时,该进程必须处理这些消息。

-type event() :: {ssh_cm, ssh:connection_ref(), channel_msg()}.
-type want_reply() :: boolean().

包含 WantReply 的消息期望通道处理进程使用 WantReply 的布尔值作为第二个参数调用 ssh_connection:reply_request/4

类型:数据传输

链接到此类型

data_ch_msg()

查看源代码 (RFC 4254, section 5.2)
-type data_ch_msg() :: {data, ssh:channel_id(), ssh_data_type_code(), Data :: binary()}.

数据已到达通道。此事件是调用 ssh_connection:send/3,4,5 的结果。

类型:关闭通道

链接到此类型

closed_ch_msg()

查看源代码 (RFC 4254, section 5.3)
-type closed_ch_msg() :: {closed, ssh:channel_id()}.

此事件是调用 ssh_connection:close/2 的结果。此事件的处理和发送都由 ssh_client_channel 行为负责。

链接到此类型

eof_ch_msg()

查看源代码 (RFC 4254, section 5.3)
-type eof_ch_msg() :: {eof, ssh:channel_id()}.

指示另一端不再发送数据。此事件是调用 ssh_connection:send_eof/2 的结果。

类型:伪终端

链接到此类型

pty_ch_msg()

查看源代码 (RFC 4254, section 6.2)
-type pty_ch_msg() ::
          {pty,
           ssh:channel_id(),
           want_reply(),
           {Terminal :: string(),
            CharWidth :: non_neg_integer(),
            RowHeight :: non_neg_integer(),
            PixelWidth :: non_neg_integer(),
            PixelHeight :: non_neg_integer(),
            TerminalModes :: [term_mode()]}}.
链接到此类型

term_mode()

查看源代码 (RFC 4254, section 6.2)
-type term_mode() :: {Opcode :: atom() | byte(), Value :: non_neg_integer()}.

已为会话请求伪终端。Terminal 是 TERM 环境变量的值,即 vt100。必须忽略零维度参数。字符/行维度将覆盖像素维度(当非零时)。像素维度是指窗口的可绘制区域。TerminalModes 列表中的 Opcode 是助记名称,表示为小写的 Erlang 原子,在 RFC 4254 第 8 节中定义。如果助记名称未在 RFC 中列出,它也可以是 Opcode。例如:OP 代码:53,助记名称 ECHO Erlang 原子:echo。此事件是调用 ssh_connection:ptty_alloc/4 的结果。

类型:环境变量

链接到此类型

env_ch_msg()

查看源代码 (RFC 4254, section 6.4)
-type env_ch_msg() :: {env, ssh:channel_id(), want_reply(), Var :: string(), Value :: string()}.

环境变量可以传递给稍后启动的 shell/命令。此事件是调用 ssh_connection:setenv/5 的结果。

类型:Shell 或命令

链接到此类型

exec_ch_msg()

查看源代码 (RFC 4254, section 6.5)
-type exec_ch_msg() :: {exec, ssh:channel_id(), want_reply(), Command :: string()}.

此消息请求服务器开始执行给定的命令。此事件是调用 ssh_connection:exec/4 的结果。

链接到此类型

shell_ch_msg()

查看源代码 (RFC 4254, section 6.5)
-type shell_ch_msg() :: {shell, ssh:channel_id(), want_reply()}.

此消息请求在另一端启动用户默认的 shell。此事件是调用 ssh_connection:shell/2 的结果。

类型:窗口更改

链接到此类型

window_change_ch_msg()

查看源代码 (RFC 4254, section 6.7)
-type window_change_ch_msg() ::
          {window_change,
           ssh:channel_id(),
           CharWidth :: non_neg_integer(),
           RowHeight :: non_neg_integer(),
           PixelWidth :: non_neg_integer(),
           PixelHeight :: non_neg_integer()}.

当客户端的窗口(终端)大小发生更改时,它可以向服务器端发送消息,告知其新的尺寸。没有 API 函数会生成此事件。

类型:信号

链接到此类型

signal_ch_msg()

查看源代码 (RFC 4254, section 6.9)
-type signal_ch_msg() :: {signal, ssh:channel_id(), SignalName :: string()}.

可以使用以下消息将信号传递给远程进程/服务。某些系统不支持信号,在这种情况下,它们将忽略此消息。目前没有函数生成此事件,因为所指的信号是在操作系统级别,而不是由 Erlang 程序生成的。

类型:退出状态

链接到此类型

exit_signal_ch_msg()

查看源代码 (RFC 4254, section 6.10)
-type exit_signal_ch_msg() ::
          {exit_signal,
           ssh:channel_id(),
           ExitSignal :: string(),
           ErrorMsg :: string(),
           LanguageString :: string()}.

由于信号,远程执行可能会暴力终止。然后可以接收此消息。有关有效字符串值的详细信息,请参阅 RFC 4254 第 6.10 节,其中显示了这些信号的特殊情况。

链接到此类型

exit_status_ch_msg()

查看源代码 (RFC 4254,第 6.10 节)
-type exit_status_ch_msg() :: {exit_status, ssh:channel_id(), ExitStatus :: non_neg_integer()}.

当另一端运行的命令终止时,可以发送以下消息以返回命令的退出状态。零 exit_status 通常表示命令成功终止。此事件是调用 ssh_connection:exit_status/3 的结果。

类型

-type channel_id() :: ssh:channel_id().
-type connection_ref() :: ssh:connection_ref().
-type reason() :: closed | timeout.

调用的结果。

如果请求到达对等节点,并且被处理,且响应到达请求节点,则 req_status/0 是对等节点报告的状态。

如果不是,则 reason/0 指示出了什么问题。

  • closed - 表示在尝试发送请求时,通道或连接已关闭。

  • timeout - 表示操作超过了时间限制。

-type req_status() :: success | failure.

请求的状态。对应于 RFC 4254 第 5.4 节中的 SSH_MSG_CHANNEL_SUCCESSSSH_MSG_CHANNEL_FAILURE 值。

-type result() :: req_status() | {error, reason()}.
-type ssh_data_type_code() :: non_neg_integer().

有效值是 0(“正常”)和 1(“stderr”),请参阅 RFC 4254 第 5.2 节

函数

链接到此函数

adjust_window(ConnectionRef, ChannelId, NumOfBytes)

查看源代码
-spec adjust_window(ConnectionRef, ChannelId, NumOfBytes) -> ok
                       when
                           ConnectionRef :: ssh:connection_ref(),
                           ChannelId :: ssh:channel_id(),
                           NumOfBytes :: integer().

调整 SSH 流控制窗口。这应由客户端和服务器端的通道进程完成。

注意

使用 ssh_client_channel 行为实现的通道通常不需要调用此函数,因为流量控制由该行为处理。每次回调 handle_ssh_msg/2 在处理通道数据后返回时,该行为都会调整窗口。

链接到此函数

close(ConnectionRef, ChannelId)

查看源代码
-spec close(ConnectionRef, ChannelId) -> ok
               when ConnectionRef :: ssh:connection_ref(), ChannelId :: ssh:channel_id().

服务器或客户端通道进程可以选择通过发送关闭事件来关闭其会话。

注意

当通道终止时,ssh_client_channel 行为会调用此函数,请参阅 ssh_client_channel。因此,使用该行为实现的通道不应显式调用此函数。

链接到此函数

exec(ConnectionRef, ChannelId, Command, Timeout)

查看源代码
-spec exec(ConnectionRef, ChannelId, Command, Timeout) -> result()
              when
                  ConnectionRef :: ssh:connection_ref(),
                  ChannelId :: ssh:channel_id(),
                  Command :: string(),
                  Timeout :: timeout().

由客户端通道进程调用,以请求服务器开始执行给定的命令。结果是根据以下模式的多个消息。最后一个消息是通道关闭消息,因为 exec 请求是一次性执行,在完成后会关闭通道。

  • N x 数据消息 - 执行命令的结果可能只有一行,也可能是数千行,具体取决于命令。

  • 0 或 1 x eof 消息 - 表示不再发送数据。

  • 0 或 1 x 退出信号消息 - 并非所有系统都发送信号。有关有效字符串值的详细信息,请参阅 RFC 4254 第 6.10 节。

  • 0 或 1 x 退出状态消息 - SSH 连接协议建议发送此消息,但并非总是如此。

  • 1 x 关闭状态消息 - 表示为执行命令启动的 ssh_client_channel 现在已关闭。

有关示例,请参阅用户指南中关于 一次性执行 的章节。

链接到此函数

exit_status(ConnectionRef, ChannelId, Status)

查看源代码
-spec exit_status(ConnectionRef, ChannelId, Status) -> ok
                     when
                         ConnectionRef :: ssh:connection_ref(),
                         ChannelId :: ssh:channel_id(),
                         Status :: integer().

由服务器通道进程调用,以将命令的退出状态发送到客户端。

链接到此函数

ptty_alloc(ConnectionRef, ChannelId, Options)

查看源代码 (自 OTP 17.5 起)
-spec ptty_alloc(ConnectionRef, ChannelId, Options) -> result()
                    when
                        ConnectionRef :: ssh:connection_ref(),
                        ChannelId :: ssh:channel_id(),
                        Options :: proplists:proplist().

等效于 ptty_alloc/4

链接到此函数

ptty_alloc(ConnectionRef, ChannelId, Options, Timeout)

查看源代码 (自 OTP 17.4 起)
-spec ptty_alloc(ConnectionRef, ChannelId, Options, Timeout) -> result()
                    when
                        ConnectionRef :: ssh:connection_ref(),
                        ChannelId :: ssh:channel_id(),
                        Options :: proplists:proplist(),
                        Timeout :: timeout().

发送 SSH 连接协议 pty_req,以分配伪终端。由 SSH 客户端进程调用。

选项

  • {term, string()} - 默认为 os:getenv("TERM"),如果未定义,则默认为 vt100

  • {width, integer()} - 如果未定义 pixel_width,则默认为 80。

  • {height, integer()} - 如果未定义 pixel_height,则默认为 24。

  • {pixel_width, integer()} - 如果定义了 width,则忽略此选项。

  • {pixel_height, integer()} - 如果定义了 height,则忽略此选项。

  • {pty_opts, [{posix_atom(), integer()}]} - 该选项可以为空列表。否则,请参阅 RFC 4254 第 8 节中可能的 POSIX 名称。

链接到此函数

reply_request(ConnectionRef, WantReply, Status, ChannelId)

查看源代码
-spec reply_request(ConnectionRef, WantReply, Status, ChannelId) -> ok
                       when
                           ConnectionRef :: ssh:connection_ref(),
                           WantReply :: boolean(),
                           Status :: req_status(),
                           ChannelId :: ssh:channel_id().

向请求者已声明它需要状态报告(即 WantReply = true)的请求发送状态回复。如果 WantReplyfalse,则调用此函数将变为“空操作”。在处理包含 WantReply 布尔值的 SSH 连接协议消息时调用。

链接到此函数

send(ConnectionRef, ChannelId, Data)

查看源代码
-spec send(connection_ref(), channel_id(), iodata()) -> ok | {error, reason()}.

等效于 send/5

链接到此函数

send(ConnectionRef, ChannelId, Type, Data)

查看源代码
-spec send(connection_ref(), channel_id(), iodata(), timeout()) -> ok | {error, reason()};
          (connection_ref(), channel_id(), ssh_data_type_code(), iodata()) -> ok | {error, reason()}.

根据输入参数,等效于下面指定的 send/5 调用之一。

如果使用整数类型的 TimeOut 调用,则等同于 send(ConnectionRef, ChannelId, 0, Data, TimeOut)

如果使用无穷原子类型的 TimeOut 调用,则等同于 send(ConnectionRef, ChannelId, 0, Data, infinity)

如果使用不是整数或无穷原子类型的最后一个参数调用,则等同于 send(ConnectionRef, ChannelId, Type, Data, infinity)

链接到此函数

send(ConnectionRef, ChannelId, Type, Data, TimeOut)

查看源代码
-spec send(connection_ref(), channel_id(), ssh_data_type_code(), iodata(), timeout()) ->
              ok | {error, reason()}.

由客户端和服务器通道进程调用,以相互发送数据。

函数 subsystem/4 和后续的 send/3,4,5 调用必须在同一个进程中执行。

链接到此函数

send_eof(ConnectionRef, ChannelId)

查看源代码
-spec send_eof(ConnectionRef, ChannelId) -> ok | {error, closed}
                  when ConnectionRef :: ssh:connection_ref(), ChannelId :: ssh:channel_id().

在通道 ChannelId 上发送 EOF。

链接到此函数

session_channel(ConnectionRef, Timeout)

查看源代码
-spec session_channel(ConnectionRef, Timeout) -> Result
                         when
                             ConnectionRef :: ssh:connection_ref(),
                             Timeout :: timeout(),
                             Result :: {ok, ssh:channel_id()} | {error, reason()}.

等效于 session_channel/4

链接到此函数

session_channel(ConnectionRef, InitialWindowSize, MaxPacketSize, Timeout)

查看源代码
-spec session_channel(ConnectionRef, InitialWindowSize, MaxPacketSize, Timeout) -> Result
                         when
                             ConnectionRef :: ssh:connection_ref(),
                             InitialWindowSize :: pos_integer() | undefined,
                             MaxPacketSize :: pos_integer() | undefined,
                             Timeout :: timeout(),
                             Result :: {ok, ssh:channel_id()} | {error, reason()}.

为 SSH 会话打开通道。从此函数返回的通道 ID 是用作此模块中其他函数输入的 ID。

链接到此函数

setenv(ConnectionRef, ChannelId, Var, Value, Timeout)

查看源代码
-spec setenv(ConnectionRef, ChannelId, Var, Value, Timeout) -> success
                when
                    ConnectionRef :: ssh:connection_ref(),
                    ChannelId :: ssh:channel_id(),
                    Var :: string(),
                    Value :: string(),
                    Timeout :: timeout().

可以在启动 shell/命令之前传递环境变量。由客户端通道进程调用。

链接到此函数

shell(ConnectionRef, ChannelId)

查看源代码
-spec shell(ConnectionRef, ChannelId) -> Result
               when
                   ConnectionRef :: ssh:connection_ref(),
                   ChannelId :: ssh:channel_id(),
                   Result :: ok | success | failure | {error, timeout}.

由客户端通道进程调用,以请求在服务器端执行用户默认的 shell(通常在 Unix 系统中的 /etc/passwd 中定义)。

注意:与此模块中的其他函数不同,返回值是 ok 而不是 success。这是一个很久以前引入的错误,任何更改都会破坏大量的现有软件。

链接到此函数

subsystem(ConnectionRef, ChannelId, Subsystem, Timeout)

查看源代码
-spec subsystem(ConnectionRef, ChannelId, Subsystem, Timeout) -> result()
                   when
                       ConnectionRef :: ssh:connection_ref(),
                       ChannelId :: ssh:channel_id(),
                       Subsystem :: string(),
                       Timeout :: timeout().

由客户端通道进程调用,以请求在服务器上执行预定义的子系统。

函数 subsystem/4 和后续的 send/3,4,5 调用必须在同一个进程中执行。