檢視原始碼 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 code: 53, mnemonic name ECHO erlang atom: 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,呼叫此函式會變成「noop」。在處理包含 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, 第 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, 第 5.3 節)
-type closed_ch_msg() :: {closed, ssh:channel_id()}.

此事件是呼叫 ssh_connection:close/2 的結果。ssh_client_channel 行為會處理此事件的處理和傳送。

連結至此類型

eof_ch_msg()

檢視原始碼 (RFC 4254, 第 5.3 節)
-type eof_ch_msg() :: {eof, ssh:channel_id()}.

表示另一端不再傳送資料。此事件是呼叫 ssh_connection:send_eof/2 的結果。

類型:虛擬終端

連結至此類型

pty_ch_msg()

檢視原始碼 (RFC 4254, 第 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, 第 6.2 節)
-type term_mode() :: {Opcode :: atom() | byte(), Value :: non_neg_integer()}.

已為會話請求虛擬終端。Terminal 是 TERM 環境變數的值,也就是 vt100。零維度參數必須忽略。字元/列維度會覆蓋像素維度(當非零時)。像素維度指的是視窗的可繪製區域。TerminalModes 列表中的 Opcode 是助憶名稱,以小寫 Erlang 原子表示,定義於 RFC 4254 第 8 節。如果助憶名稱未列於 RFC 中,則也可以是 Opcode。範例:OP code: 53, mnemonic name ECHO erlang atom: echo。此事件是呼叫 ssh_connection:ptty_alloc/4 的結果。

類型:環境變數

連結至此類型

env_ch_msg()

檢視原始碼 (RFC 4254, 第 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, 第 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, section 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,呼叫此函式會變成「noop」。在處理包含 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 為 infinity 原子,則等同於 send(ConnectionRef, ChannelId, 0, Data, infinity)

如果呼叫時最後一個參數不是整數或 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 呼叫必須在同一個程序中執行。