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

ssh 应用程序的主要 API

这是 SSH 应用程序的接口模块。安全外壳 (SSH) 协议是一种用于在不安全的网络上进行安全远程登录和其他安全网络服务的协议。有关支持的 RFC、版本、算法和 Unicode 处理的详细信息,请参阅 ssh

使用 SSH 应用程序,可以启动客户端和启动守护进程(服务器)。

客户端通过 connect/2connect/3connect/4 启动。它们在 TCP/IP 之上打开一个加密连接。在该加密连接中,可以使用 ssh_connection:session_channel/2,4 打开一个或多个通道。

每个通道都是客户端进程和服务器端进程之间的隔离“管道”。这些进程对可以处理例如文件传输 (sftp) 或远程命令执行(shell、exec 和/或 cli)。如果实现了自定义 shell,则客户端用户可以远程执行特殊命令。请注意,用户不一定是人,而很可能是一个与 SSH 应用程序交互的系统。

客户端使用 ssh_connection:subsystem/4 请求服务器端子系统(通道)服务器。

服务器(守护进程)通过 daemon/1daemon/2daemon/3 启动。可能的通道处理程序(子系统)在启动守护进程时使用 subsystem 选项声明。

要在远程计算机上仅运行 shell,可以使用将所需三个步骤捆绑到一个函数中的函数:shell/1,2,3。同样,要仅打开与远程计算机的 sftp(文件传输)连接,最简单的方法是使用 ssh_sftp:start_channel/1,2,3

要编写自己的客户端通道处理程序,请使用行为 ssh_client_channel。对于服务器通道处理程序,请使用 ssh_server_channel 行为(替换 ssh_daemon_channel)。

客户端和守护进程都接受控制确切行为的选项。某些选项对两者都是通用的。这三组选项称为 客户端选项守护进程选项通用选项

选项的描述使用带有解释文本的 Erlang 类型语言

注意

另请参阅 SSH 应用程序参考示例 部分。

密钥和文件

SSH 应用程序要工作,必须存在许多对象。这些对象默认存储在文件中。默认名称、路径和文件格式与 OpenSSH 相同。可以使用 OpenSSH 中的 ssh-keygen 程序生成密钥。请参阅 用户指南

可以通过选项轻松更改路径:user_dirsystem_dir

通过使用行为 ssh_client_key_api 和/或 ssh_server_key_api 编写回调模块,可以与完全不同的存储进行交互。可以使用选项 key_cb 将回调模块安装到客户端和/或守护进程。

守护进程

密钥默认存储在文件中

  • 必需:一个或多个主机密钥,包括私钥和公钥。默认是将它们存储在目录 /etc/ssh 的文件中

    • ssh_host_dsa_keyssh_host_dsa_key.pub
    • ssh_host_rsa_keyssh_host_rsa_key.pub
    • ssh_host_ecdsa_keyssh_host_ecdsa_key.pub

    可以使用选项 system_dir 更改主机密钥目录。

  • 可选:在 publickey 授权的情况下,一个或多个用户的公钥。默认是将它们连接存储在用户主目录中的文件 .ssh/authorized_keys 中。

    可以使用选项 user_dir 更改用户密钥目录。

客户端

密钥和一些其他数据默认存储在用户主目录中的 .ssh 目录中的文件中。

可以使用选项 user_dir 更改目录。

  • 可选:先前连接的主机的主机公钥列表。此列表由 SSH 应用程序处理,无需用户协助。默认是将它们存储在文件 known_hosts 中。

    host_accepting_client_options/0 与此密钥列表相关联。

  • 可选:在 publickey 授权的情况下,一个或多个用户的私钥。默认文件为

    • id_dsaid_dsa.pub
    • id_rsaid_rsa.pub
    • id_ecdsaid_ecdsa.pub

摘要

类型:客户端选项

  • user - 提供用户名。如果未提供此选项,ssh 将从环境中读取(UNIX 上为 LOGNAMEUSER,Windows 上为 USERNAME)。

客户端的选项。以下或通过单击超链接进一步解释各个选项。

设置传输层连接时间的超时。对于 gen_tcp,时间以毫秒为单位,默认值为 infinity

设置三个 diffie-hellman-group-exchange 参数,这些参数指导连接的服务器选择一个组。有关详细信息,请参阅 RFC 4419。默认值为 {1024, 6144, 8192}

  • silently_accept_hosts - 此选项指导 connect 函数在连接的服务器提供客户端以前未见过的主机密钥时如何操作。默认是使用 stdio 向用户提问是否接受或拒绝新的主机密钥。请参阅选项 user_dir,以指定文件 known_hosts 的路径,其中记录了先前接受的主机密钥。另请参阅选项 key_cb,以了解处理密钥的通用方法。

使客户端告知服务器客户端接受扩展协商,即在发送的 kexinit 消息中包含 ext-info-c。有关详细信息,请参阅 RFC 8308,有关当前实现的扩展列表,请参阅 ssh

类型:守护进程选项

  • connectfun - 提供一个 fun,用于在用户向服务器进行身份验证时实现您自己的日志记录。

守护进程的选项。以下或通过单击超链接进一步解释各个选项。

旧式 exec 规范,保留用于兼容性,但不应在新程序中使用

此选项更改守护进程如何执行来自客户端的 exec 请求。如果返回值中的项是非字符串类型,则会将其格式化为字符串。在 ok 的情况下不会添加尾随换行符。

有关强化的更多信息,请参阅用户指南章节中的 强化 部分。

ssh 会话设置的第一部分(hello 消息交换)的最大时间(以毫秒为单位)。默认为 30000 毫秒(30 秒)。如果客户端在此时间内未能发送第一个消息,则连接将关闭。

完成身份验证协商后第一次启动通道的最大时间(以毫秒为单位)。默认为 infinity

身份验证协商的最大时间(以毫秒为单位)。默认为 120000 毫秒(2 分钟)。如果客户端在此时间内未能登录,则连接将关闭。

等效于 pwdfun_4/0

  • auth_method_kb_interactive_data - 设置守护进程发送到客户端的文本字符串,以便在使用 keyboard-interactive 身份验证时呈现给用户。

使服务器(守护进程)告知客户端服务器接受扩展协商,即在发送的 kexinit 消息中包含 ext-info-s。有关详细信息,请参阅 RFC 8308,有关当前实现的扩展列表,请参阅 ssh

定义当客户端请求 shell 时守护进程中使用的读取-求值-打印循环。默认是使用 Erlang shell:{shell, start, []}

在守护进程中提供您自己的 CLI 实现。

  • dh_gex_groups - 定义当协商 diffie-hellman-group-exchange 时服务器可以从中选择的组。有关详细信息,请参阅 RFC 4419。此选项的三个变体是

定义守护进程中的子系统。

启用 (true) 或禁用 (false) 将 TCP/IP 连接隧道传输到 服务器的可能性。默认情况下禁用。

启用 (true) 或禁用 (false) 将 TCP/IP 连接隧道传输出 服务器的可能性。默认情况下禁用。

类型:通用选项

逗号分隔的字符串,用于确定客户端应支持哪些身份验证方法以及尝试的顺序。默认为 "publickey,keyboard-interactive,password"

以上选项可以在客户端和守护进程(服务器)中使用。以下对它们进行了进一步的解释。

提供一个 fun,用于在断开连接时实现您自己的日志记录或其他处理。

用于算法协商的算法列表。默认的 algs_list/0 可以从 default_algorithms/0 获取。

允许使用现有的文件描述符(传递给传输协议)。

守护进程最初将呈现给连接对等方的字符串。默认值是 “Erlang/VSN”,其中 VSN 是 ssh 应用程序的版本号。

当主机地址指定为 any 时使用的 IP 版本。

实现 ssh_client_key_api 和/或 ssh_server_key_api 行为的模块。 可用于自定义公钥的处理。 如果在模块名称之外还提供了回调选项,则它们通过传递给回调模块的 'key_cb_private' 键下的选项提供给回调模块。

设置重新密钥的限制。可以配置最大时间和最大数据量。

在没有打开通道的情况下设置连接的超时时间。默认为 infinity。单位是毫秒。

设置日志项大小的限制(不包括标头)。单位是字节,默认值是 500。

修改用于算法协商的算法列表。修改是在应用选项 preferred_algorithms(如果存在)之后应用的。

尝试使用的用户(客户端)公钥算法列表。

ip-addressport 一起使用,以唯一标识 ssh 守护程序。这在虚拟化环境中可能很有用,在虚拟化环境中,可能有多个服务器具有相同的 ip-addressport。 如果未显式设置此属性,则假定 ip-addressport 唯一标识 SSH 守护程序。

提供一个 fun 来实现您自己的 SSH 消息 SSH_MSG_DEBUG 的日志记录。最后三个参数来自消息,请参阅 RFC 4253,第 11.3 节connection_ref/0 是消息到达的连接的引用。不检查 fun 的返回值。

提供一个 fun,用于在意外消息到达时实现您自己的日志记录或其他操作。如果 fun 返回 report,则发出通常的信息报告,但如果返回 skip,则不生成任何报告。

类型:其他数据类型

表示连接内部通道的不透明数据类型。

来自 connection_info/1connection_info/2 函数的返回值。

表示客户端和服务器(守护进程)之间连接的不透明数据类型。

来自 daemon_info/1daemon_info/2 函数的返回值。

表示守护进程的不透明数据类型。

定义不在产品中使用的实验性选项的不透明类型。

该套接字应是 gen_tcp:connectgen_tcp:accept 的结果。该套接字必须处于被动模式(即,使用选项 {active,false}) 打开)。

函数

关闭 SSH 连接。

等效于 connect/4

连接到 HostPort 的 SSH 服务器。

返回有关连接的信息,用于例如调试或日志记录。

等效于 daemon/3

等效于 daemon/3

启动一个服务器,侦听给定端口上的 SSH 连接。如果 Port 为 0,则选择一个随机空闲端口。有关如何查找所选端口号,请参阅 daemon_info/1

返回有关守护进程的信息,用于例如调试或日志记录。

将正在运行的守护进程中的选项替换为 NewUserOptions 中的选项。仅影响此调用之后建立的连接,而不影响已建立的连接。

返回键值列表,其中键是不同类型的算法,值是算法本身。

获取 SSH 连接下的 TCP 套接字的 TCP 套接字选项值。

hostkey_fingerprint([DigestType], HostKey) -> [string()]hostkey_fingerprint(DigestType, HostKey) -> string()

在 SSH 连接下的 TCP 套接字上设置 TCP 套接字选项。

等效于 shell/3

连接到 HostPort(默认为 22)上的 SSH 服务器,并在该远程主机上启动交互式 shell。

等效于 start/1

启动应用程序 cryptopublic_keyssh 的实用函数。默认类型为 temporary。有关更多信息,请参阅 Kernel 中的 application 手册页。

停止 ssh 应用程序。有关更多信息,请参阅 Kernel 中的 application 手册页。

停止侦听器以及由侦听器启动的所有连接。

停止侦听器,但保持侦听器启动的现有连接处于运行状态。

要求 ConnectionRef 的远程服务器侦听 ListenHost:ListenPort。当有人连接该地址时,连接将从服务器通过加密通道转发到客户端。然后客户端(即调用此函数的节点)连接到 ConnectToHost:ConnectToPort

告诉本地客户端侦听 ListenHost:ListenPort。当有人连接该地址时,连接将通过加密通道转发到 ConnectionRef 的对等服务器。然后该服务器连接到 ConnectToHost:ConnectToPort

类型:客户端选项

-type accept_callback() ::
          fun((PeerName :: string(), fingerprint()) -> boolean()) |
          fun((PeerName :: string(), Port :: inet:port_number(), fingerprint()) -> boolean()).
-type accept_hosts() ::
          boolean() | accept_callback() | {HashAlgoSpec :: fp_digest_alg(), accept_callback()}.
链接到此类型

authentication_client_options()

查看源代码
-type authentication_client_options() :: {user, string()} | {password, string()}.
  • user - 提供用户名。如果未提供此选项,ssh 将从环境中读取(UNIX 上为 LOGNAMEUSER,Windows 上为 USERNAME)。

  • password - 提供用于密码身份验证的密码。如果未提供此选项,则如果尝试使用密码身份验证方法,将要求用户输入密码。

客户端的选项。以下或通过单击超链接进一步解释各个选项。

请注意,并非所有 gen_tcp:connect_option/0 都被接受。有关禁止选项的列表,请参阅 set_sock_opts/2

另请注意,设置 gen_tcp:connect_option/0 可能会以负面方式影响 SSH 客户端行为的方式更改套接字。您需要自行承担风险使用它。

-type client_options() :: [client_option()].
链接到此类型

connect_timeout_client_option()

查看源代码
-type connect_timeout_client_option() :: {connect_timeout, timeout()}.

设置传输层连接时间的超时。对于 gen_tcp,时间以毫秒为单位,默认值为 infinity

有关协商阶段的超时,请参阅 connect/4 中的参数 Timeout

链接到此类型

diffie_hellman_group_exchange_client_option()

查看源代码
-type diffie_hellman_group_exchange_client_option() ::
          {dh_gex_limits, {Min :: pos_integer(), I :: pos_integer(), Max :: pos_integer()}}.

设置三个 diffie-hellman-group-exchange 参数,这些参数指导连接的服务器选择一个组。有关详细信息,请参阅 RFC 4419。默认值为 {1024, 6144, 8192}

-type fingerprint() :: string() | [string()].
-type fp_digest_alg() :: md5 | crypto:sha1() | crypto:sha2().
链接到此类型

host_accepting_client_options()

查看源代码
-type host_accepting_client_options() ::
          {silently_accept_hosts, accept_hosts()} |
          {user_interaction, boolean()} |
          {save_accepted_host, boolean()} |
          {quiet_mode, boolean()}.
  • silently_accept_hosts - 此选项指导 connect 函数在连接的服务器呈现客户端以前未见过的 Host Key 时如何操作。默认是在标准输出上询问用户是否接受或拒绝新的 Host Key。有关指定以前接受的 Host Key 记录在文件 known_hosts 中的路径,请参阅选项 user_dir。另请参阅选项 key_cb,了解处理密钥的通用方法。

    该选项可以通过三种不同的形式给出,如上文所示。

    • 该值是一个 boolean/0 类型。值为 true 将使客户端接受任何未知的 Host Key,而无需任何用户交互。值为 false 则保留默认行为,即在 stdio 上询问用户。
    • 将会调用一个 accept_callback/0,并且布尔返回值 true 将使客户端接受 Host Key。返回值为 false 将使客户端拒绝 Host Key,从而关闭连接。该函数的参数如下:
      • PeerName - 远程主机的名称或地址字符串。
      • FingerPrint - 由 hostkey_fingerprint/1 计算得出的 Host Key 指纹。
    • 一个元组 {HashAlgoSpec, accept_callback}HashAlgoSpec 指定用于计算 accept_callback/0 调用中使用的指纹的哈希算法。 HashALgoSpec 可以是原子或原子列表,作为 hostkey_fingerprint/2 中的第一个参数。如果它是一个哈希算法名称的列表,则 accept_callback/0 中的 FingerPrint 参数将是一个指纹列表,其顺序与 HashAlgoSpec 列表中的对应名称相同。
  • user_interaction - 如果为 false,则禁用客户端在需要任何用户交互时连接到服务器,例如接受将服务器添加到 known_hosts 文件或提供密码。

    即使允许用户交互,也可以通过其他选项(例如 silently_accept_hostspassword)来抑制。但是,从安全角度来看,这些选项并不总是可取的。

    默认为 true

  • save_accepted_host - 如果为 true,客户端将保存已接受的 Host Key,以避免下次连接同一主机时出现接受询问。如果不存在 key_cb 选项,则该密钥将保存在 “known_hosts” 文件中。有关该文件的位置,请参见 user_dir 选项。

    如果为 false,则不保存该密钥,并且下次访问同一主机时该密钥仍然未知。

    默认为 true

  • quiet_mode - 如果为 true,客户端在授权时不会打印任何内容。

    默认为 false

链接到此类型

recv_ext_info_client_option()

查看源代码
-type recv_ext_info_client_option() :: {recv_ext_info, boolean()}.

使客户端告知服务器客户端接受扩展协商,即在发送的 kexinit 消息中包含 ext-info-c。有关详细信息,请参阅 RFC 8308,有关当前实现的扩展列表,请参阅 ssh

默认值为 true,与不支持 ext-info 的其他实现兼容。

类型:守护进程选项

链接到此类型

authentication_daemon_options()

查看源代码
-type authentication_daemon_options() ::
          ssh_file:system_dir_daemon_option() |
          {auth_method_kb_interactive_data, prompt_texts()} |
          {user_passwords, [{UserName :: string(), Pwd :: string()}]} |
          {pk_check_user, boolean()} |
          {password, string()} |
          {pwdfun, pwdfun_2() | pwdfun_4()} |
          {no_auth_needed, boolean()}.
链接到此类型

callbacks_daemon_options()

查看源代码
-type callbacks_daemon_options() ::
          {failfun, fun((User :: string(), PeerAddress :: inet:ip_address(), Reason :: term()) -> _)} |
          {connectfun,
           fun((User :: string(), PeerAddress :: inet:ip_address(), Method :: string()) -> _)}.
  • connectfun - 提供一个 fun,用于在用户向服务器进行身份验证时实现您自己的日志记录。

  • failfun - 提供一个函数,用于在用户身份验证失败时实现您自己的日志记录。

守护进程的选项。以下或通过单击超链接进一步解释各个选项。

请注意,并非每个 gen_tcp:listen_option/0 都被接受。有关禁止的选项列表,请参见 set_sock_opts/2

另请注意,设置 gen_tcp:listen_option/0 可能会以负面方式影响 ssh 守护进程的行为。您需要自行承担使用风险。

-type daemon_options() :: [daemon_option()].
-type deprecated_exec_opt() :: fun() | mod_fun_args().

旧式 exec 规范,保留用于兼容性,但不应在新程序中使用

链接到此类型

diffie_hellman_group_exchange_daemon_option()

查看源代码
-type diffie_hellman_group_exchange_daemon_option() ::
          {dh_gex_groups, [explicit_group()] | explicit_group_file() | ssh_moduli_file()} |
          {dh_gex_limits, {Min :: pos_integer(), Max :: pos_integer()}}.
-type exec_daemon_option() :: {exec, exec_spec()}.
-type exec_fun() :: 'exec_fun/1'() | 'exec_fun/2'() | 'exec_fun/3'().
-type 'exec_fun/1'() :: fun((Cmd :: string()) -> exec_result()).
-type 'exec_fun/2'() :: fun((Cmd :: string(), User :: string()) -> exec_result()).
-type 'exec_fun/3'() ::
          fun((Cmd :: string(), User :: string(), ClientAddr :: ip_port()) -> exec_result()).
-type exec_result() :: {ok, Result :: term()} | {error, Reason :: term()}.

此选项更改守护进程如何执行来自客户端的 exec 请求。如果返回值中的项是非字符串类型,则会将其格式化为字符串。在 ok 的情况下不会添加尾随换行符。

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

错误文本在通道类型 1 上返回,通常会管道传输到例如 Linux 系统上的 stderr。成功执行的文本在通道类型 0 上返回,并将以类似方式管道传输到 stdout。成功时,退出状态码设置为 0,错误时设置为 255。客户端上呈现的确切结果取决于客户端和客户端的操作系统。

{direct, exec_fun()} 变体或根本没有 exec 选项的情况下,从 standard_input 的所有读取都将来自类型 0 的接收到的数据事件。这些事件由客户端发送。类似地,对 standard_output 的所有写入都将作为数据事件发送到客户端。像命令 ‘ssh’ 这样的 OS shell 客户端通常会将 stdin 和 stdout 用于用户界面。

该选项以下列方式与守护进程选项 shell 协同工作

  • 1. 如果 exec-optionshell-option 都不存在: - 默认的 Erlang 求值器用于 exec 和 shell 请求。结果将返回给客户端。

  • 2. 如果 exec_spec 的值为 disabledshell-option 可能存在也可能不存在): - 不会执行任何 exec 请求,但是 shell 请求不受影响,它们会遵循 shell_spec 的值。

  • 3. 如果 exec-option 存在并且 exec_spec 值 =/= disabledshell-option 可能存在也可能不存在): - exec_spec fun() 将使用与该函数的 arity 相同的参数数量调用,并且结果将返回给客户端。Shell 请求不受影响,它们会遵循 shell_spec 的值。

  • 4. 如果 exec-option 不存在,并且 shell-option 存在,并且默认的 Erlang shell 作为 shell_spec 的值: - 默认的 Erlang 求值器用于 exec 和 shell 请求。结果将返回给客户端。

  • 5. 如果 exec-option 不存在,并且 shell-option 存在,其值既不是默认的 Erlang shell 也不是值 disabled - 不会评估 exec 请求,并且会向客户端返回错误消息。Shell 请求根据 shell_spec 的值执行。

  • 6. 如果 exec-option 不存在,并且 shell_spec 的值为 disabled - Exec 请求由默认 shell 执行,但是 shell 请求不执行。

如果安装了自定义 CLI(请参见选项 ssh_cli),则以上规则将替换为自定义 CLI 暗示的规则。

注意

exec-option 已存在很长时间,但以前没有记录。保留了旧的定义和行为,但在冲突时遵守上述规则 1-6。旧的且未记录的样式不应在新程序中使用。

-type exec_spec() :: {direct, exec_fun()} | disabled | deprecated_exec_opt().
-type explicit_group() :: {Size :: pos_integer(), G :: pos_integer(), P :: pos_integer()}.
-type explicit_group_file() :: {file, string()}.
链接到此类型

hardening_daemon_options()

查看源代码
-type hardening_daemon_options() ::
          {max_sessions, pos_integer()} |
          {max_channels, pos_integer()} |
          {parallel_login, boolean()} |
          {minimal_remote_max_packet_size, pos_integer()}.

有关强化的更多信息,请参阅用户指南章节中的 强化 部分。

  • max_sessions - 此守护进程在任何时间接受的最大同时会话数。这包括正在授权的会话。因此,如果设置为 N,并且有 N 个客户端已连接但未启动登录过程,则会中止连接尝试 N+1。如果 N 个连接已通过身份验证并仍在登录中,则在现有连接之一注销之前,不会接受更多登录。

    该计数器是每个侦听端口的。因此,如果启动两个守护进程,一个使用 {max_sessions,N},另一个使用 {max_sessions,M},则整个 ssh 应用程序总共接受 N+M 个连接。

    请注意,如果 parallel_loginfalse,则一次只能有一个客户端处于身份验证阶段。

    默认情况下,未设置此选项。这意味着数量不受限制。

  • max_channels - 对于此守护进程的每个连接,接受的最大活动远程子系统通道数

    默认情况下,未设置此选项。这意味着数量不受限制。

  • parallel_login - 如果设置为 false(默认值),则一次只能处理一个登录。如果设置为 true,则允许同时进行无限数量的登录尝试。

    如果 max_sessions 选项设置为 N,并且 parallel_login 设置为 true,则任何时候允许的最大同时登录尝试次数限制为 N-K,其中 K 是此守护进程中存在的经过身份验证的连接数。

    警告

    在没有通过其他方式保护服务器(例如,使用 max_sessions 选项或防火墙配置)的情况下,不要启用 parallel_logins。如果设置为 true,则无法防止 DOS 攻击。

  • minimal_remote_max_packet_size - 守护进程在客户端的通道打开请求中将接受的最小最大数据包大小。默认值为 0。

链接到此类型

hello_timeout_daemon_option()

查看源代码
-type hello_timeout_daemon_option() :: {hello_timeout, timeout()}.

ssh 会话设置的第一部分(hello 消息交换)的最大时间(以毫秒为单位)。默认为 30000 毫秒(30 秒)。如果客户端在此时间内未能发送第一个消息,则连接将关闭。

有关超时的更多信息,请参见用户指南 强化 章节中的 超时部分

-type kb_int_fun_3() ::
          fun((Peer :: ip_port(), User :: string(), Service :: string()) -> kb_int_tuple()).
-type kb_int_fun_4() ::
          fun((Peer :: ip_port(), User :: string(), Service :: string(), State :: any()) ->
                  kb_int_tuple()).
-type kb_int_tuple() ::
          {Name :: string(), Instruction :: string(), Prompt :: string(), Echo :: boolean()}.
链接到此类型

max_initial_idle_time_daemon_option()

查看源代码
-type max_initial_idle_time_daemon_option() :: {max_initial_idle_time, timeout()}.

完成身份验证协商后第一次启动通道的最大时间(以毫秒为单位)。默认为 infinity

有关超时的更多信息,请参见用户指南 强化 章节中的 超时部分

链接到此类型

negotiation_timeout_daemon_option()

查看源代码
-type negotiation_timeout_daemon_option() :: {negotiation_timeout, timeout()}.

身份验证协商的最大时间(以毫秒为单位)。默认为 120000 毫秒(2 分钟)。如果客户端在此时间内未能登录,则连接将关闭。

有关超时的更多信息,请参见用户指南 强化 章节中的 超时部分

-type prompt_texts() :: kb_int_tuple() | kb_int_fun_3() | kb_int_fun_4().
-type pwdfun_2() :: fun((User :: string(), Password :: string() | pubkey) -> boolean()).

等效于 pwdfun_4/0

-type pwdfun_4() ::
          fun((User :: string(),
               Password :: string() | pubkey,
               PeerAddress :: ip_port(),
               State :: any()) ->
                  boolean() | disconnect | {boolean(), NewState :: any()}).
  • auth_method_kb_interactive_data - 设置守护进程发送到客户端的文本字符串,以便在使用 keyboard-interactive 身份验证时呈现给用户。

    如果使用 fun/3 或 fun/4,则会在实际进行身份验证时调用它,因此可能会返回动态数据,例如时间、远程 IP 等。

    参数 Echo 指导客户端是否需要隐藏密码。

    默认值为:{auth_method_kb_interactive_data, {"SSH server", "Enter password for \""++User++"\"", "password: ", false}>

  • user_passwords - 提供用于密码身份验证的密码。当有人尝试连接到服务器并且公钥用户身份验证失败时,会使用这些密码。该选项提供有效的用户名列表和相应的密码。

    警告

    请注意,由于纯文本密码,这是非常不安全的;它旨在用于测试目的。请使用 pwdfun 选项来处理密码检查。

  • pk_check_user - 启用在进行公钥身份验证时检查服务器中的客户端用户名。默认情况下禁用。

    在 OpenSSH 和 Erlang/OTP 中的 SSH 中,“用户” 一词的用法不同:有关更多信息,请参见用户指南

    如果启用了该选项,并且没有 pwdfun,则用户名必须存在于 user_passwords 中才能使检查成功,但是不检查密码的值。

    如果使用 pwdfun 检查用户,原子 pubkey 将被放入密码参数中。

  • password - 提供一个全局密码,用于验证任何用户。

    警告

    旨在方便测试。

    从安全角度来看,此选项使服务器非常容易受到攻击。

  • pwdfun with pwdfun_4/0 - 提供一个用于密码验证的函数。此函数可用于调用外部系统或处理存储为哈希值的密码。

    此函数还可用于在身份验证尝试中进行延迟,例如通过调用 timer:sleep/1

    为了方便例如计算失败的尝试次数,可以使用 State 变量。此状态仅针对每个连接。首次为连接调用 pwdfun 时,State 变量的值为 undefined

    该函数应返回

    • 如果用户和密码有效,则返回 true
    • 如果用户或密码无效,则返回 false
    • 如果应立即发送 SSH_MSG_DISCONNECT 消息,则返回 disconnect。之后将关闭底层 tcp 连接。
    • 如果用户和密码有效,则返回 {true, NewState:any()}
    • 如果用户或密码无效,则返回 {false, NewState:any()}

    第三种用法是阻止来自行为不端的对等方的登录尝试。可以使用上面描述的 State。返回值 disconnect 对此很有用。

    如果设置了 pk_check_user,则在验证公钥登录时,原子 pubkey 将被放入密码参数中。然后,pwdfun 负责检查用户名是否有效。

  • pwdfun with pwdfun_2/0 - 提供一个用于密码验证的函数。此函数以字符串形式调用用户和密码,并返回

    • 如果用户和密码有效,则返回 true
    • 如果用户或密码无效,则返回 false

    如果设置了 pk_check_user,则在验证公钥登录时,原子 pubkey 将被放入密码参数中。然后,pwdfun 负责检查用户名是否有效。

    保留此变体是为了兼容性。

  • no_auth_needed - 如果 true,则无需提供任何密码或密钥即可验证客户端的身份。

    由于接受任何连接客户端的风险很高,因此此选项仅适用于非常特殊的应用程序。

    默认值为 false

链接到此类型

send_ext_info_daemon_option()

查看源代码
-type send_ext_info_daemon_option() :: {send_ext_info, boolean()}.

使服务器(守护进程)告知客户端服务器接受扩展协商,即在发送的 kexinit 消息中包含 ext-info-s。有关详细信息,请参阅 RFC 8308,有关当前实现的扩展列表,请参阅 ssh

默认值为 true,与不支持 ext-info 的其他实现兼容。

-type shell_daemon_option() :: {shell, shell_spec()}.

等效于 'shell_fun/2'/0

-type shell_fun() :: 'shell_fun/1'() | 'shell_fun/2'().

等效于 'shell_fun/2'/0

-type 'shell_fun/1'() :: fun((User :: string()) -> pid()).

等效于 'shell_fun/2'/0

-type 'shell_fun/2'() :: fun((User :: string(), PeerAddr :: inet:ip_address()) -> pid()).

定义当客户端请求 shell 时守护进程中使用的读取-求值-打印循环。默认是使用 Erlang shell:{shell, start, []}

有关守护程序如何根据 shell 和 exec 选项执行 shell 请求和 exec 请求的说明,请参阅选项 exec-option

-type shell_spec() :: mod_fun_args() | shell_fun() | disabled.
链接到此类型

ssh_cli_daemon_option()

查看源代码
-type ssh_cli_daemon_option() :: {ssh_cli, mod_args() | no_cli}.

在守护进程中提供您自己的 CLI 实现。

它是一个通道回调模块,用于实现 shell 和命令执行。可以使用选项 shell 来自定义 shell 的读-求值-打印循环。这意味着比实现自己的 CLI 通道的工作量要少。如果 ssh_cli 设置为 no_cli,则 CLI 通道(如 shellexec)将被禁用,并且只允许子系统通道。

-type ssh_moduli_file() :: {ssh_moduli_file, string()}.
  • dh_gex_groups - 定义当协商 diffie-hellman-group-exchange 时服务器可以从中选择的组。有关详细信息,请参阅 RFC 4419。此选项的三个变体是

    • {Size=integer(),G=integer(),P=integer()} - 组在此列表中显式给出。可能存在多个具有相同 Size 的元素。在这种情况下,服务器将在协商的 Size 中随机选择一个。

    • {file,filename()} - 该文件必须具有一个或多个以点结尾的三元组 {Size=integer(),G=integer(),P=integer()}。守护程序启动时会读取该文件。

    • {ssh_moduli_file,filename()} - 该文件必须采用 ssh-keygen moduli 文件格式。守护程序启动时会读取该文件。

    默认列表从 public_key 应用程序中获取。

  • dh_gex_limits - 限制客户端在 diffie-hellman-group-exchange 中可以请求的内容。限制将为 {MaxUsed = min(MaxClient,Max), MinUsed = max(MinClient,Min)},其中 MaxClientMinClient 是连接客户端提出的值。

    默认值为 {0,infinity}

    如果在密钥交换中 MaxUsed < MinUsed,则密钥交换将失败并断开连接。

    有关 Max 和 Min 值的功能,请参阅 RFC 4419

链接到此类型

subsystem_daemon_option()

查看源代码
-type subsystem_daemon_option() :: {subsystems, subsystem_specs()}.
-type subsystem_spec() :: {Name :: string(), mod_args()}.

定义守护进程中的子系统。

subsystem_name 是客户端请求启动的名称,例如 ssh_connection:subsystem/4

channel_callback 是在守护程序中实现 ssh_server_channel(取代 ssh_daemon_channel)行为的模块。有关更多信息和示例,请参阅用户指南中的创建子系统部分。

如果 subsystems 选项不存在,则使用 ssh_sftpd:subsystem_spec([]) 的值。这默认启用 sftp 子系统。如果不想让守护程序运行任何子系统,则可以将该选项设置为空列表。

-type subsystem_specs() :: [subsystem_spec()].
链接到此类型

tcpip_tunnel_in_daemon_option()

查看源代码
-type tcpip_tunnel_in_daemon_option() :: {tcpip_tunnel_in, boolean()}.

启用 (true) 或禁用 (false) 将 TCP/IP 连接隧道传输到 服务器的可能性。默认情况下禁用。

链接到此类型

tcpip_tunnel_out_daemon_option()

查看源代码
-type tcpip_tunnel_out_daemon_option() :: {tcpip_tunnel_out, boolean()}.

启用 (true) 或禁用 (false) 将 TCP/IP 连接隧道传输出 服务器的可能性。默认情况下禁用。

类型:通用选项

-type alg_entry() ::
          {kex, [kex_alg()]} |
          {public_key, [pubkey_alg()]} |
          {cipher, double_algs(cipher_alg())} |
          {mac, double_algs(mac_alg())} |
          {compression, double_algs(compression_alg())}.
-type algs_list() :: [alg_entry()].
链接到此类型

auth_methods_common_option()

查看源代码
-type auth_methods_common_option() :: {auth_methods, string()}.

逗号分隔的字符串,用于确定客户端应支持哪些身份验证方法以及尝试的顺序。默认为 "publickey,keyboard-interactive,password"

请注意,客户端可以自由使用任何顺序并排除方法。

-type cipher_alg() ::
          '[email protected]' | 'aes256-ctr' | 'aes192-ctr' | '[email protected]' |
          'aes128-ctr' | 'AEAD_AES_256_GCM' | 'AEAD_AES_128_GCM' | '[email protected]' |
          'aes256-cbc' | 'aes192-cbc' | 'aes128-cbc' | '3des-cbc'.

以上选项可以在客户端和守护进程(服务器)中使用。以下对它们进行了进一步的解释。

-type common_options() :: [common_option()].
-type compression_alg() :: none | zlib | '[email protected]'.
链接到此类型

disconnectfun_common_option()

查看源代码
-type disconnectfun_common_option() :: {disconnectfun, fun((Reason :: term()) -> void | any())}.

提供一个 fun,用于在断开连接时实现您自己的日志记录或其他处理。

-type double_algs(AlgType) :: [{client2server, [AlgType]} | {server2client, [AlgType]}] | [AlgType].

用于算法协商的算法列表。默认的 algs_list/0 可以从 default_algorithms/0 获取。

如果 algs_list() 中缺少 alg_entry(),则该条目使用默认值。

以下是此选项的示例

	  {preferred_algorithms,
	  [{public_key,['ssh-rsa','ssh-dss']},
	  {cipher,[{client2server,['aes128-ctr']},
          {server2client,['aes128-cbc','3des-cbc']}]},
	  {mac,['hmac-sha2-256','hmac-sha1']},
	  {compression,[none,zlib]}
	  ]
	  }

该示例在两个方向(client2server 和 server2client)中指定了不同的密码算法,但在两个方向中为 mac 和压缩指定了相同的算法。kex(密钥交换)是隐式的,但显式设置了 public_key。

有关背景和更多示例,请参阅用户指南

如果算法名称在列表中出现多次,则行为未定义。还假定属性列表中的标签最多出现一次。

警告

更改值可能会降低连接的安全性。除非您确切知道自己在做什么,否则不要更改。如果您不理解这些值,则不应该更改它们。

-type fd_common_option() :: {fd, gen_tcp:socket()}.

允许使用现有的文件描述符(传递给传输协议)。

链接到此类型

id_string_common_option()

查看源代码
-type id_string_common_option() ::
          {id_string, string() | random | {random, Nmin :: pos_integer(), Nmax :: pos_integer()}}.

守护进程最初将呈现给连接对等方的字符串。默认值是 “Erlang/VSN”,其中 VSN 是 ssh 应用程序的版本号。

random 将导致在每次连接尝试时创建一个随机字符串。这是为了使恶意对等方更难找到 ssh 软件品牌和版本。

{random, Nmin, Nmax} 将创建一个至少包含 Nmin 个字符且最多包含 Nmax 个字符的随机字符串。

-type inet_common_option() :: {inet, inet | inet6}.

当主机地址指定为 any 时使用的 IP 版本。

-type kex_alg() ::
          'curve25519-sha256' | '[email protected]' | 'curve448-sha512' |
          'ecdh-sha2-nistp521' | 'ecdh-sha2-nistp384' | 'ecdh-sha2-nistp256' |
          'diffie-hellman-group-exchange-sha256' | 'diffie-hellman-group16-sha512' |
          'diffie-hellman-group18-sha512' | 'diffie-hellman-group14-sha256' |
          'diffie-hellman-group14-sha1' | 'diffie-hellman-group-exchange-sha1' |
          'diffie-hellman-group1-sha1'.
链接到此类型

key_cb_common_option()

查看源代码
-type key_cb_common_option() :: {key_cb, Module :: atom() | {Module :: atom(), Opts :: [term()]}}.

实现 ssh_client_key_api 和/或 ssh_server_key_api 行为的模块。 可用于自定义公钥的处理。 如果在模块名称之外还提供了回调选项,则它们通过传递给回调模块的 'key_cb_private' 键下的选项提供给回调模块。

当仅指定 Module 时,Opts 默认为 []

此选项的默认值为 {ssh_file, []}。另请参阅 ssh_file 的手册页。

对回调函数 F 的调用将是

	  Module:F(..., [{key_cb_private,Opts}|UserOptions])

其中 ...ssh_client_key_api 和/或 ssh_server_key_api 中的 F 的参数。UserOptions 是提供给 ssh:connectssh:shellssh:daemon 的选项。

-type limit_bytes() :: non_neg_integer() | infinity.
-type limit_time() :: pos_integer() | infinity.

设置重新密钥的限制。可以配置最大时间和最大数据量。

  • {Minutes, Bytes} 在达到任何限制时启动重新密钥。
  • 当传输的字节数达到 Bytes 时,或最迟在一小时后,Bytes 将启动重新密钥。

完成重新密钥后,计时器和字节计数器都将重新启动。默认为一小时和一个 GByte。

如果 Minutes 设置为 infinity,则由于超过了最大时间,将永远不会发生重新密钥。将 Bytes 设置为 infinity 将禁止在传输一定数量的数据后进行重新密钥。如果选项值设置为 {infinity, infinity},则不会启动重新密钥。请注意,仍将执行由对等方启动的重新密钥。

-type mac_alg() ::
          '[email protected]' | '[email protected]' | 'hmac-sha2-512' |
          'hmac-sha2-256' | '[email protected]' | 'hmac-sha1' | 'hmac-sha1-96' |
          'AEAD_AES_256_GCM' | 'AEAD_AES_128_GCM'.
链接到此类型

max_idle_time_common_option()

查看源代码
-type max_idle_time_common_option() :: {idle_time, timeout()}.

在没有打开通道的情况下设置连接的超时时间。默认为 infinity。单位是毫秒。

超时直到启动通道后才激活,因此它不会限制从连接创建到第一个通道打开的时间。

有关超时的更多信息,请参见用户指南 强化 章节中的 超时部分

链接到此类型

max_log_item_len_common_option()

查看源代码
-type max_log_item_len_common_option() :: {max_log_item_len, limit_bytes()}.

设置日志项大小的限制(不包括标头)。单位是字节,默认值是 500。

链接到此类型

modify_algorithms_common_option()

查看源代码
-type modify_algorithms_common_option() :: {modify_algorithms, modify_algs_list()}.
-type modify_algs_list() :: [{append, algs_list()} | {prepend, algs_list()} | {rm, algs_list()}].

修改用于算法协商的算法列表。修改是在应用选项 preferred_algorithms(如果存在)之后应用的。

修改的算法如下所示

  • 输入是 modify_algs_list/0 和一组算法 A,如果存在,则从 preferred_algorithms 选项中获取,否则从 ssh:default_algorithms/0 中获取。

  • modify_algs_list/0 的开头修改 A,得到结果 A'

    可能的修改是

    • 将支持但未启用的算法附加或前置到算法列表。如果所需的算法已在 A 中,则会先将其删除,然后再附加或前置,
    • A 中删除 (rm) 一个或多个算法。
  • 使用 modify_algs_list/0 的尾部和结果 A' 重复修改步骤。

如果 modify_algs_list/0 中有不支持的算法,则会将其静默忽略

如果存在多个 modify_algorithms 选项,则结果未定义。

以下是此选项的示例

	  {modify_algorithms,
	  [{prepend, [{kex, ['diffie-hellman-group1-sha1']}],
	  {rm,      [{compression, [none]}]}
	  ]
	  }

该示例指定

  • 旧的密钥交换算法 'diffie-hellman-group1-sha1' 应该是主要替代方案。它将是主要的替代方案,因为它被预先添加到列表中
  • 压缩算法 none (= 不压缩) 被删除,因此强制执行压缩

有关背景和更多示例,请参阅用户指南

链接到此类型

pref_public_key_algs_common_option()

查看源代码
-type pref_public_key_algs_common_option() :: {pref_public_key_algs, [pubkey_alg()]}.

尝试使用的用户(客户端)公钥算法列表。

默认值是 ssh:default_algorithms/0 返回的列表中的 public_key 条目。

如果没有指定类型的公钥可用,则会忽略相应的条目。请注意,可用集取决于底层密码库和当前用户的公钥。

另请参阅选项 user_dir,用于指定用户密钥的路径。

链接到此类型

preferred_algorithms_common_option()

查看源代码
-type preferred_algorithms_common_option() :: {preferred_algorithms, algs_list()}.
链接到此类型

profile_common_option()

查看源代码
-type profile_common_option() :: {profile, atom()}.

ip-addressport 一起使用,以唯一标识 ssh 守护程序。这在虚拟化环境中可能很有用,在虚拟化环境中,可能有多个服务器具有相同的 ip-addressport。 如果未显式设置此属性,则假定 ip-addressport 唯一标识 SSH 守护程序。

-type pubkey_alg() ::
          'ssh-ed25519' | 'ssh-ed448' | 'ecdsa-sha2-nistp521' | 'ecdsa-sha2-nistp384' |
          'ecdsa-sha2-nistp256' | 'rsa-sha2-512' | 'rsa-sha2-256' | 'ssh-rsa' | 'ssh-dss'.
链接到此类型

rekey_limit_common_option()

查看源代码
-type rekey_limit_common_option() ::
          {rekey_limit, Bytes :: limit_bytes() | {Minutes :: limit_time(), Bytes :: limit_bytes()}}.
链接到此类型

ssh_msg_debug_fun_common_option()

查看源代码
-type ssh_msg_debug_fun_common_option() ::
          {ssh_msg_debug_fun,
           fun((ssh:connection_ref(),
                AlwaysDisplay :: boolean(),
                Msg :: binary(),
                LanguageTag :: binary()) ->
                   any())}.

提供一个 fun 来实现您自己的 SSH 消息 SSH_MSG_DEBUG 的日志记录。最后三个参数来自消息,请参阅 RFC 4253,第 11.3 节connection_ref/0 是消息到达的连接的引用。不检查 fun 的返回值。

默认行为是忽略该消息。要为每个带有 AlwaysDisplay = true 的消息获取打印输出,请例如使用 {ssh_msg_debug_fun, fun(_,true,M,_)-> io:format("DEBUG: ~p~n", [M]) end}

链接到此类型

unexpectedfun_common_option()

查看源代码
-type unexpectedfun_common_option() ::
          {unexpectedfun, fun((Message :: term(), {Host :: term(), Port :: term()}) -> report | skip)}.

提供一个 fun,用于在意外消息到达时实现您自己的日志记录或其他操作。如果 fun 返回 report,则发出通常的信息报告,但如果返回 skip,则不生成任何报告。

类型:其他数据类型

-opaque channel_id()

表示连接内部通道的不透明数据类型。

由函数 ssh_connection:session_channel/2,4 返回。

-type conn_info_algs() ::
          [{kex, kex_alg()} |
           {hkey, pubkey_alg()} |
           {encrypt, cipher_alg()} |
           {decrypt, cipher_alg()} |
           {send_mac, mac_alg()} |
           {recv_mac, mac_alg()} |
           {compress, compression_alg()} |
           {decompress, compression_alg()} |
           {send_ext_info, boolean()} |
           {recv_ext_info, boolean()}].
-type conn_info_channels() :: [proplists:proplist()].

来自 connection_info/1connection_info/2 函数的返回值。

option info 元组中,仅包含与默认值不同的选项。

链接到此类型

connection_info_tuple()

查看源代码
-type connection_info_tuple() ::
          {client_version, version()} |
          {server_version, version()} |
          {user, string()} |
          {peer, {inet:hostname(), ip_port()}} |
          {sockname, ip_port()} |
          {options, client_options()} |
          {algorithms, conn_info_algs()} |
          {channels, conn_info_channels()}.
-type connection_ref() :: pid().

表示客户端和服务器(守护进程)之间连接的不透明数据类型。

由函数 connect/2,3,4ssh_sftp:start_channel/2,3 返回。

-type daemon_info_tuple() ::
          {port, inet:port_number()} |
          {ip, inet:ip_address()} |
          {profile, atom()} |
          {options, daemon_options()}.

来自 daemon_info/1daemon_info/2 函数的返回值。

option info 元组中,仅包含与默认值不同的选项。

-opaque daemon_ref()

表示守护进程的不透明数据类型。

由函数 daemon/1,2,3 返回。

-type host() :: string() | inet:ip_address() | loopback.
-type ip_port() :: {inet:ip_address(), inet:port_number()}.
-type mod_args() :: {Module :: atom(), Args :: list()}.
-type mod_fun_args() :: {Module :: atom(), Function :: atom(), Args :: list()}.
链接到此类型

opaque_client_options()

查看源代码
-type opaque_client_options() ::
          {keyboard_interact_fun,
           fun((Name :: iodata(),
                Instruction :: iodata(),
                Prompts :: [{Prompt :: iodata(), Echo :: boolean()}]) ->
                   [Response :: iodata()])} |
          opaque_common_options().
链接到此类型

opaque_common_options()

查看源代码
-type opaque_common_options() ::
          {transport, {atom(), atom(), atom()}} |
          {vsn, {non_neg_integer(), non_neg_integer()}} |
          {tstflg, [term()]} |
          ssh_file:user_dir_fun_common_option() |
          {max_random_length_padding, non_neg_integer()}.

定义不在产品中使用的实验性选项的不透明类型。

链接到此类型

opaque_daemon_options()

查看源代码
-type opaque_daemon_options() :: {infofun, fun()} | opaque_common_options().
-type open_socket() :: gen_tcp:socket().

该套接字应是 gen_tcp:connectgen_tcp:accept 的结果。该套接字必须处于被动模式(即,使用选项 {active,false}) 打开)。

-type protocol_version() :: {Major :: pos_integer(), Minor :: non_neg_integer()}.
-type software_version() :: string().
-type version() :: {protocol_version(), software_version()}.

类型

-type role() :: client | server.
-opaque ssh_channel_id()
-opaque ssh_connection_ref()
-opaque ssh_daemon_ref()

函数

-spec close(ConnectionRef) -> ok | {error, term()} when ConnectionRef :: connection_ref().

关闭 SSH 连接。

链接到此函数

connect(OpenTcpSocket, Options)

查看源代码 (自 OTP 19.0 起)
-spec connect(OpenTcpSocket, Options) -> {ok, connection_ref()} | {error, term()}
                 when OpenTcpSocket :: open_socket(), Options :: client_options().

等效于 connect/4

-spec connect(open_socket(), client_options(), timeout()) -> {ok, connection_ref()} | {error, term()};
             (host(), inet:port_number(), client_options()) -> {ok, connection_ref()} | {error, term()}.

等效于 connect/4

链接到此函数

connect(Host, Port, Options, NegotiationTimeout)

查看源代码
-spec connect(Host, Port, Options, NegotiationTimeout) -> {ok, connection_ref()} | {error, term()}
                 when
                     Host :: host(),
                     Port :: inet:port_number(),
                     Options :: client_options(),
                     NegotiationTimeout :: timeout().

连接到 HostPort 的 SSH 服务器。

作为替代方法,可以将已打开的 TCP 套接字传递给函数中的 TcpSocket。SSH 初始化和协商将在该套接字上启动,另一端应为 SSH。

没有启动通道。这通过调用 ssh_connection:session_channel/2,4 完成。

NegotiationTimeout 以毫秒为单位。默认值为 infinityconnect_timeout 选项的值(如果存在)。对于连接超时,请使用选项 connect_timeout

链接到此函数

connection_info(ConnectionRef)

查看源代码 (自 OTP 22.1 起)
-spec connection_info(ConnectionRef) -> InfoTupleList
                         when
                             ConnectionRef :: connection_ref(),
                             InfoTupleList :: [InfoTuple],
                             InfoTuple :: connection_info_tuple().

等效于 connection_info/2

链接到此函数

connection_info(ConnectionRef, Key)

查看源代码
-spec connection_info(ConnectionRef, ItemList | Item) -> InfoTupleList | InfoTuple
                         when
                             ConnectionRef :: connection_ref(),
                             ItemList :: [Item],
                             Item ::
                                 client_version | server_version | user | peer | sockname | options |
                                 algorithms | sockname,
                             InfoTupleList :: [InfoTuple],
                             InfoTuple :: connection_info_tuple().

返回有关连接的信息,用于例如调试或日志记录。

Key 是单个 Item 时,结果是一个 InfoTuple

-spec daemon(inet:port_number()) -> {ok, daemon_ref()} | {error, term()}.

等效于 daemon/3

-spec daemon(inet:port_number() | open_socket(), daemon_options()) ->
                {ok, daemon_ref()} | {error, term()}.

等效于 daemon/3

链接到此函数

daemon(HostAddress, Port, Options)

查看源代码
-spec daemon(any | inet:ip_address(), inet:port_number(), daemon_options()) ->
                {ok, daemon_ref()} | {error, term()};
            (socket, open_socket(), daemon_options()) -> {ok, daemon_ref()} | {error, term()}.

启动一个服务器,侦听给定端口上的 SSH 连接。如果 Port 为 0,则选择一个随机空闲端口。有关如何查找所选端口号,请参阅 daemon_info/1

作为替代方案,可以将已打开的 TCP 套接字以 TcpSocket 的形式传递给该函数。当 TCP 套接字的另一端启动 SSH 时,将在此套接字上启动 SSH 初始化和协商。

有关选项的说明,请参阅 守护进程选项

请注意,由于历史原因,HostAddress 参数和 gen_tcp connect_option() {ip,Address} 都设置了监听地址。这可能会导致设置不一致。

处理这两个地址传递选项的规则是

  • 如果 HostAddress 是 IP 地址,则该 IP 地址为监听地址。如果存在“ip”选项,则会将其丢弃。
  • 如果 HostAddress 是原子 loopback,则监听地址为 loopback,并且底层层将选择一个回环地址。如果存在“ip”选项,则会将其丢弃。
  • 如果 HostAddress 是原子 any 且不存在“ip”选项,则监听地址为 any,并且套接字将监听所有地址。
  • 如果 HostAddressany 并且存在“ip”选项,则监听地址设置为“ip”选项的值。
链接到此函数

daemon_info(DaemonRef)

查看源代码 (自 OTP 19.0 起)
-spec daemon_info(DaemonRef) -> {ok, InfoTupleList} | {error, bad_daemon_ref}
                     when
                         DaemonRef :: daemon_ref(),
                         InfoTupleList :: [InfoTuple],
                         InfoTuple :: daemon_info_tuple().

等效于 daemon_info/2

链接到此函数

daemon_info/2

查看源代码 (自 OTP 22.1 起)
-spec daemon_info(DaemonRef, ItemList | Item) -> InfoTupleList | InfoTuple | {error, bad_daemon_ref}
                     when
                         DaemonRef :: daemon_ref(),
                         ItemList :: [Item],
                         Item :: ip | port | profile | options,
                         InfoTupleList :: [InfoTuple],
                         InfoTuple :: daemon_info_tuple().

返回有关守护进程的信息,用于例如调试或日志记录。

Key 是单个 Item 时,结果是一个 InfoTuple

请注意,由于兼容性原因,daemon_info/1daemon_info/2 返回不同类型。

链接到此函数

daemon_replace_options(DaemonRef, NewUserOptions)

查看源代码 (自 OTP 25.1 起)
-spec daemon_replace_options(DaemonRef, NewUserOptions) -> {ok, daemon_ref()} | {error, term()}
                                when DaemonRef :: daemon_ref(), NewUserOptions :: daemon_options().

将正在运行的守护进程中的选项替换为 NewUserOptions 中的选项。仅影响此调用之后建立的连接,而不影响已建立的连接。

注意

在此函数的最后阶段,监听进程将重新启动。因此,在此最后阶段尝试连接到守护进程可能会失败。

Erlang 配置的处理在《用户指南》中有描述;请参阅 SSH 中的配置在 SSH 中配置算法 章节。

链接到此函数

default_algorithms()

查看源代码 (自 OTP 18.0 起)
-spec default_algorithms() -> algs_list().

返回键值列表,其中键是不同类型的算法,值是算法本身。

有关示例,请参阅 《用户指南》

链接到此函数

get_sock_opts(ConnectionRef, SocketGetOptions)

查看源代码 (自 OTP 22.3 起)
-spec get_sock_opts(ConnectionRef, SocketGetOptions) -> ok | {error, inet:posix()}
                       when
                           ConnectionRef :: connection_ref(),
                           SocketGetOptions :: [gen_tcp:option_name()].

获取 SSH 连接下的 TCP 套接字的 TCP 套接字选项值。

此函数调用 inet:getopts/2,请阅读该文档。

链接到此函数

hostkey_fingerprint(Key)

查看源代码 (自 OTP 24.0 起)
-spec hostkey_fingerprint(public_key:public_key()) -> string().

等效于 hostkey_fingerprint/2

链接到此函数

hostkey_fingerprint(TypeOrTypes, Key)

查看源代码 (自 OTP 24.0 起)
-spec hostkey_fingerprint(TypeOrTypes, Key) -> StringOrString
                             when
                                 TypeOrTypes :: public_key:digest_type() | [public_key:digest_type()],
                                 Key :: public_key:public_key(),
                                 StringOrString :: string() | [string()].

hostkey_fingerprint([DigestType], HostKey) -> [string()]hostkey_fingerprint(DigestType, HostKey) -> string()

从公钥计算 SSH 指纹,就像 OpenSSH 所做的那样。

hostkey_fingerprint/1 中的算法是 md5,以便与较旧的 ssh-keygen 命令兼容。第二个变体的字符串前面会加上大写的算法名称,就像较新的 ssh-keygen 命令一样。

示例

 2> ssh:hostkey_fingerprint(Key).
 "f5:64:a6:c1:5a:cb:9f:0a:10:46:a2:5c:3e:2f:57:84"

 3> ssh:hostkey_fingerprint(md5,Key).
 "MD5:f5:64:a6:c1:5a:cb:9f:0a:10:46:a2:5c:3e:2f:57:84"

 4> ssh:hostkey_fingerprint(sha,Key).
 "SHA1:bSLY/C4QXLDL/Iwmhyg0PGW9UbY"

 5> ssh:hostkey_fingerprint(sha256,Key).
 "SHA256:aZGXhabfbf4oxglxltItWeHU7ub3Dc31NcNw2cMJePQ"

 6> ssh:hostkey_fingerprint([sha,sha256],Key).
 ["SHA1:bSLY/C4QXLDL/Iwmhyg0PGW9UbY",
  "SHA256:aZGXhabfbf4oxglxltItWeHU7ub3Dc31NcNw2cMJePQ"]
链接到此函数

set_sock_opts(ConnectionRef, SocketOptions)

查看源代码 (自 OTP 22.3 起)
-spec set_sock_opts(ConnectionRef, SocketOptions) -> ok | {error, inet:posix()}
                       when ConnectionRef :: connection_ref(), SocketOptions :: [gen_tcp:option()].

在 SSH 连接下的 TCP 套接字上设置 TCP 套接字选项。

此函数调用 inet:setopts/2,请阅读该文档,以及关于 gen_tcp:option/0 的文档。

除了以下选项外,允许使用所有 gen_tcp 套接字选项

  • active
  • deliver
  • mode
  • packet

这些排除的选项由 SSH 应用程序保留。

警告

这是一个极其危险的函数。您需要自行承担使用风险。

某些选项取决于操作系统和操作系统版本。除非您了解选项值对 TCP 流的影响,否则请勿使用它。

某些值可能会破坏 SSH 协议的功能。

-spec shell(open_socket() | host() | connection_ref()) -> _.

等效于 shell/3

-spec shell(open_socket() | host(), client_options()) -> _.

等效于 shell/3

链接到此函数

shell(Host, Port, Options)

查看源代码
-spec shell(Host, Port, Options) -> _
               when Host :: host(), Port :: inet:port_number(), Options :: client_options().

连接到 HostPort(默认为 22)上的 SSH 服务器,并在该远程主机上启动交互式 shell。

作为替代方案,可以将已打开的 TCP 套接字以 TcpSocket 的形式传递给该函数。将在此套接字上启动 SSH 初始化和协商,最后将在 TCP 套接字另一端的主机上启动 shell。

有关选项的说明,请参阅 客户端选项

该函数等待用户输入,并且在远程 shell 结束(即退出 shell)之前不会返回。

-spec start() -> ok | {error, term()}.

等效于 start/1

-spec start(Type) -> ok | {error, term()} when Type :: permanent | transient | temporary.

启动应用程序 cryptopublic_keyssh 的实用函数。默认类型为 temporary。有关更多信息,请参阅 Kernel 中的 application 手册页。

-spec stop() -> ok | {error, term()}.

停止 ssh 应用程序。有关更多信息,请参阅 Kernel 中的 application 手册页。

链接到此函数

stop_daemon(DaemonRef)

查看源代码
-spec stop_daemon(DaemonRef :: daemon_ref()) -> ok.

等效于 stop_daemon/3

链接到此函数

stop_daemon(Address, Port)

查看源代码
-spec stop_daemon(inet:ip_address(), inet:port_number()) -> ok.

等效于 stop_daemon/3

链接到此函数

stop_daemon(Address, Port, Profile)

查看源代码 (自 OTP 21.0 起)
-spec stop_daemon(any | inet:ip_address(), inet:port_number(), atom()) -> ok.

停止侦听器以及由侦听器启动的所有连接。

-spec stop_listener(daemon_ref()) -> ok.

等效于 stop_listener/3

链接到此函数

stop_listener(Address, Port)

查看源代码
-spec stop_listener(inet:ip_address(), inet:port_number()) -> ok.

等效于 stop_listener/3

链接到此函数

stop_listener(Address, Port, Profile)

查看源代码 (自 OTP 21.0 起)
-spec stop_listener(any | inet:ip_address(), inet:port_number(), term()) -> ok.

停止侦听器,但保持侦听器启动的现有连接处于运行状态。

链接到此函数

tcpip_tunnel_from_server(ConnectionRef, ListenHost, ListenPort, ConnectToHost, ConnectToPort)

查看源代码 (自 OTP 23.0 起)
-spec tcpip_tunnel_from_server(ConnectionRef, ListenHost, ListenPort, ConnectToHost, ConnectToPort) ->
                                  {ok, TrueListenPort} | {error, term()}
                                  when
                                      ConnectionRef :: connection_ref(),
                                      ListenHost :: host(),
                                      ListenPort :: inet:port_number(),
                                      ConnectToHost :: host(),
                                      ConnectToPort :: inet:port_number(),
                                      TrueListenPort :: inet:port_number().

等效于 tcpip_tunnel_from_server/6

链接到此函数

tcpip_tunnel_from_server(ConnectionRef, ListenHost, ListenPort, ConnectToHost, ConnectToPort, Timeout)

查看源代码 (自 OTP 23.0 起)
-spec tcpip_tunnel_from_server(ConnectionRef, ListenHost, ListenPort, ConnectToHost, ConnectToPort,
                               Timeout) ->
                                  {ok, TrueListenPort} | {error, term()}
                                  when
                                      ConnectionRef :: connection_ref(),
                                      ListenHost :: host(),
                                      ListenPort :: inet:port_number(),
                                      ConnectToHost :: host(),
                                      ConnectToPort :: inet:port_number(),
                                      Timeout :: timeout(),
                                      TrueListenPort :: inet:port_number().

要求 ConnectionRef 的远程服务器侦听 ListenHost:ListenPort。当有人连接该地址时,连接将从服务器通过加密通道转发到客户端。然后客户端(即调用此函数的节点)连接到 ConnectToHost:ConnectToPort

返回的 TrueListenPort 是监听的端口。它与 ListenPort 相同,除非 ListenPort = 0。在这种情况下,底层操作系统会选择一个空闲端口。

请注意,如果对等端是 Erlang/OTP SSH 服务器(守护进程),则该服务器必须已使用选项 tcpip_tunnel_out 启动才能允许连接。

链接到此函数

tcpip_tunnel_to_server(ConnectionRef, ListenHost, ListenPort, ConnectToHost, ConnectToPort)

查看源代码 (自 OTP 23.0 起)
-spec tcpip_tunnel_to_server(ConnectionRef, ListenHost, ListenPort, ConnectToHost, ConnectToPort) ->
                                {ok, TrueListenPort} | {error, term()}
                                when
                                    ConnectionRef :: connection_ref(),
                                    ListenHost :: host(),
                                    ListenPort :: inet:port_number(),
                                    ConnectToHost :: host(),
                                    ConnectToPort :: inet:port_number(),
                                    TrueListenPort :: inet:port_number().

等效于 tcpip_tunnel_to_server/6

链接到此函数

tcpip_tunnel_to_server(ConnectionRef, ListenHost, ListenPort, ConnectToHost, ConnectToPort, Timeout)

查看源代码 (自 OTP 23.0 起)
-spec tcpip_tunnel_to_server(ConnectionRef, ListenHost, ListenPort, ConnectToHost, ConnectToPort,
                             Timeout) ->
                                {ok, TrueListenPort} | {error, term()}
                                when
                                    ConnectionRef :: connection_ref(),
                                    ListenHost :: host(),
                                    ListenPort :: inet:port_number(),
                                    ConnectToHost :: host(),
                                    ConnectToPort :: inet:port_number(),
                                    Timeout :: timeout(),
                                    TrueListenPort :: inet:port_number().

告诉本地客户端侦听 ListenHost:ListenPort。当有人连接该地址时,连接将通过加密通道转发到 ConnectionRef 的对等服务器。然后该服务器连接到 ConnectToHost:ConnectToPort

返回的 TrueListenPort 是监听的端口。它与 ListenPort 相同,除非 ListenPort = 0。在这种情况下,底层操作系统会选择一个空闲端口。

请注意,如果对等端是 Erlang/OTP SSH 服务器(守护进程),则该服务器必须已使用选项 tcpip_tunnel_in 启动才能允许连接。