Provided by: erlang-manpages_18.3-dfsg-1ubuntu3.1_all bug

NAME

       ssh - Main API of the ssh application

DESCRIPTION

       Interface module for the ssh application.

       See ssh(7) for details of supported version, algorithms and unicode support.

OPTIONS

       The  exact  behaviour  of some functions can be adjusted with the use of options which are
       documented together with the functions. Generally could each option be used  at  most  one
       time  in  each  function  call.  If given two or more times, the effect is not predictable
       unless explicitly documented.

       The options are of different kinds:

         Limits:
           which alters limits in the system, for example number of simultaneous login attempts.

         Timeouts:
           which give some defined behaviour if too long time elapses before  a  given  event  or
           action, for example time to wait for an answer.

         Callbacks:
           which  gives  the  caller  of the function the possibility to execute own code on some
           events, for example calling an own  logging  function  or  to  perform  an  own  login
           function

         Behaviour:
           which changes the systems behaviour.

DATA TYPES

       Type  definitions that are used more than once in this module, or abstractions to indicate
       the intended use of the data type, or both:

         boolean() =:
           true | false

         string() =:
           [byte()]

         ssh_daemon_ref() =:
           opaque() - as returned by ssh:daemon/[1,2,3]

         ssh_connection_ref() =:
           opaque() - as returned by ssh:connect/3

         ip_address() =:
           inet::ip_address

         subsystem_spec() =:
           {subsystem_name(), {channel_callback(), channel_init_args()}}

         subsystem_name() =:
           string()

         channel_callback() =:
           atom() - Name of the Erlang module implementing the subsystem  using  the  ssh_channel
           behavior, see ssh_channel(3erl)

         key_cb() =:
           atom() | {atom(), list()}

           atom()  -  Name of the erlang module implementing the behaviours ssh_client_key_api or
           ssh_client_key_api as the case maybe.

           list() - List of options that can be passed to the callback module.

         channel_init_args() =:
           list()

         algs_list() =:
           list( alg_entry() )

         alg_entry() =:
           {kex, simple_algs()} | {public_key, simple_algs()} | {cipher, double_algs()}  |  {mac,
           double_algs()} | {compression, double_algs()}

         simple_algs() =:
           list( atom() )

         double_algs() =:
           [{client2serverlist,simple_algs()},{server2client,simple_algs()}] | simple_algs()

EXPORTS

       close(ConnectionRef) -> ok

              Types:

                 ConnectionRef = ssh_connection_ref()

              Closes an SSH connection.

       connect(Host, Port, Options) ->
       connect(Host, Port, Options, Timeout) -> {ok, ssh_connection_ref()} | {error, Reason}

              Types:

                 Host = string()
                 Port = integer()
                   22 is default, the assigned well-known port number for SSH.
                 Options = [{Option, Value}]
                 Timeout = infinity | integer()
                   Negotiation  time-out  in  milli-seconds.  The  default value is infinity. For
                   connection time-out, use option {connect_timeout, timeout()}.

              Connects to an SSH  server.  No  channel  is  started.  This  is  done  by  calling
              ssh_connection:session_channel/[2, 4].

              Options:

                {inet, inet | inet6}:
                  IP version to use.

                {user_dir, string()}:
                  Sets  the  user  directory, that is, the directory containing ssh configuration
                  files for the user, such as known_hosts, id_rsa,  id_dsa,  and  authorized_key.
                  Defaults to the directory normally referred to as ~/.ssh.

                {dsa_pass_phrase, string()}:
                  If  the user DSA key is protected by a passphrase, it can be supplied with this
                  option.

                {rsa_pass_phrase, string()}:
                  If the user RSA key is protected by a passphrase, it can be supplied with  this
                  option.

                {silently_accept_hosts, boolean()}:
                  When  true,  hosts  are  added to the file known_hosts without asking the user.
                  Defaults to false.

                {user_interaction, boolean()}:
                  If false, disables the client to connect to the server if any user  interaction
                  is needed, such as accepting the server to be added to the known_hosts file, or
                  supplying a password. Defaults to true. Even if user interaction is allowed  it
                  can be suppressed by other options, such as silently_accept_hosts and password.
                  However, those optins are not always desirable to use from a security point  of
                  view.

                {disconnectfun, fun(Reason:term()) -> _}:
                  Provides  a  fun  to  implement  your own logging when a server disconnects the
                  client.

                {unexpectedfun, fun(Message:term(), Peer) -> report | skip }:
                  Provides a fun to implement your own logging or other action when an unexpected
                  message  arrives. If the fun returns report the usual info report is issued but
                  if skip is returned no report is generated.

                  Peer is in the format of {Host,Port}.

                {public_key_alg, 'ssh-rsa' | 'ssh-dss'}:

            Note:
                This option will be removed in OTP 20, but  is  kept  for  compatibility.  It  is
                ignored if the preferred pref_public_key_algs option is used.

                  Sets  the preferred public key algorithm to use for user authentication. If the
                  preferred algorithm fails, the other algorithm is  tried.  If  {public_key_alg,
                  'ssh-rsa'}  is set, it is translated to {pref_public_key_algs, ['ssh-rsa','ssh-
                  dss']}.  If  it  is  {public_key_alg,   'ssh-dss'},   it   is   translated   to
                  {pref_public_key_algs, ['ssh-dss','ssh-rsa']}.

                {pref_public_key_algs, list()}:
                  List of user (client) public key algorithms to try to use.

                  The   default   value   is   ['ssh-rsa','ssh-dss','ecdsa-sha2-nistp256','ecdsa-
                  sha2-nistp384','ecdsa-sha2-nistp521']

                  If there is no public key of a  specified  type  available,  the  corresponding
                  entry is ignored.

                {preferred_algorithms, algs_list()}:
                  List of algorithms to use in the algorithm negotiation. The default algs_list()
                  can be obtained from default_algorithms/0.

                  If an alg_entry() is missing in the algs_list(), the default value is used  for
                  that entry.

                  Here is an example of this option:

                {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]}
                }

                  The example specifies different algorithms in the two directions (client2server
                  and server2client), for cipher but specifies the same algorithms  for  mac  and
                  compression  in  both  directions.  The  kex  (key  exchange)  is  implicit but
                  public_key is set explicitly.

            Warning:
                Changing the values can make a connection less secure. Do not change  unless  you
                know exactly what you are doing. If you do not understand the values then you are
                not supposed to change them.

                {dh_gex_limits,{Min=integer(),I=integer(),Max=integer()}}:
                  Sets  the  three  diffie-hellman-group-exchange  parameters  that  guides   the
                  connected  server in choosing a group. See RFC 4419 for the function of thoose.
                  The default value is {1024, 6144, 8192}.

                {connect_timeout, timeout()}:
                  Sets a time-out on the transport layer connection. For gen_tcp the time  is  in
                  milli-seconds and the default value is infinity.

                {user, string()}:
                  Provides  a  username.  If  this  option  is  not  given,  ssh  reads  from the
                  environment (LOGNAME or USER on UNIX, USERNAME on Windows).

                {password, string()}:
                  Provides a password for password authentication. If this option is  not  given,
                  the  user  is  asked  for  a password, if the password authentication method is
                  attempted.

                {key_cb, key_cb()}:
                  Module implementing the behaviour ssh_client_key_api. Can be used to  customize
                  the  handling  of  public keys. If callback options are provided along with the
                  module name, they are made available to the callback  module  via  the  options
                  passed to it under the key 'key_cb_private'.

                {quiet_mode, atom() = boolean()}:
                  If true, the client does not print anything on authorization.

                {id_string, random | string()}:
                  The  string  that  the  client  presents  to  a connected server initially. The
                  default value is "Erlang/VSN" where VSN is the ssh application version number.

                  The value random will cause a random string to be created  at  each  connection
                  attempt.  This  is to make it a bit more difficult for a malicious peer to find
                  the ssh software brand and version.

                {fd, file_descriptor()}:
                  Allows an existing file descriptor  to  be  used  (by  passing  it  on  to  the
                  transport protocol).

                {rekey_limit, integer()}:
                  Provides, in bytes, when rekeying is to be initiated. Defaults to once per each
                  GB and once per hour.

                {idle_time, integer()}:
                  Sets a time-out on a connection  when  no  channels  are  active.  Defaults  to
                  infinity.

                {ssh_msg_debug_fun,                      fun(ConnectionRef::ssh_connection_ref(),
                AlwaysDisplay::boolean(), Msg::binary(), LanguageTag::binary()) -> _}:
                  Provide a fun to implement your own logging of the SSH  message  SSH_MSG_DEBUG.
                  The  last three parameters are from the message, see RFC4253, section 11.3. The
                  ConnectionRef is the reference to the connection on which the message  arrived.
                  The return value from the fun is not checked.

                  The default behaviour is ignore the message. To get a printout for each message
                  with   AlwaysDisplay   =   true,   use    for    example    {ssh_msg_debug_fun,
                  fun(_,true,M,_)-> io:format("DEBUG: ~p~n", [M]) end}

       connection_info(ConnectionRef, [Option]) ->[{Option, Value}]

              Types:

                 Option = client_version | server_version | user | peer | sockname
                 Value = [option_value()]
                 option_value() = {{Major::integer(), Minor::integer()}, VersionString::string()}
                 |     User::string()     |      Peer::{inet:hostname(),      {inet::ip_adress(),
                 inet::port_number()}} | Sockname::{inet::ip_adress(), inet::port_number()}

              Retrieves information about a connection.

       daemon(Port) ->
       daemon(Port, Options) ->
       daemon(HostAddress, Port, Options) -> {ok, ssh_daemon_ref()} | {error, atom()}

              Types:

                 Port = integer()
                 HostAddress = ip_address() | any
                 Options = [{Option, Value}]
                 Option = atom()
                 Value = term()

              Starts a server listening for SSH connections on the given port.

              Options:

                {inet, inet | inet6}:
                  IP version to use when the host address is specified as any.

                {subsystems, [subsystem_spec()]}:
                  Provides  specifications  for  handling  of  subsystems.  The  "sftp" subsystem
                  specification  is  retrieved  by  calling  ssh_sftpd:subsystem_spec/1.  If  the
                  subsystems  option  is not present, the value of [ssh_sftpd:subsystem_spec([])]
                  is used. The option can be set to the empty list if you do not want the  daemon
                  to run any subsystems.

                {shell,  {Module, Function, Args} | fun(string() = User) - > pid() | fun(string()
                = User, ip_address() = PeerAddr) -> pid()}:
                  Defines the read-eval-print loop used when a shell is requested by the  client.
                  The default is to use the Erlang shell: {shell, start, []}

                {ssh_cli, {channel_callback(), channel_init_args()} | no_cli}:
                  Provides  your  own CLI implementation, that is, a channel callback module that
                  implements a shell and command execution. The shell read-eval-print loop can be
                  customized,  using  the option shell. This means less work than implementing an
                  own CLI channel. If set to no_cli, the  CLI  channels  are  disabled  and  only
                  subsystem channels are allowed.

                {user_dir, string()}:
                  Sets  the  user  directory. That is, the directory containing ssh configuration
                  files for the user, such as known_hosts, id_rsa,  id_dsa,  and  authorized_key.
                  Defaults to the directory normally referred to as ~/.ssh.

                {system_dir, string()}:
                  Sets the system directory, containing the host key files that identify the host
                  keys for ssh. Defaults to /etc/ssh. For security  reasons,  this  directory  is
                  normally accessible only to the root user.

                {auth_methods, string()}:
                  Comma-separated  string  that  determines which authentication methods that the
                  server  is  to  support  and  in  what  order  they  are  tried.  Defaults   to
                  "publickey,keyboard-interactive,password"

                {auth_method_kb_interactive_data, PromptTexts}
                  where:
                  PromptTexts   =   kb_int_tuple()   |   fun(Peer::{IP::tuple(),Port::integer()},
                  User::string(), Service::string()) -> kb_int_tuple()
                  kb_int_tuple()  =  {Name::string(),  Instruction::string(),   Prompt::string(),
                  Echo::boolean()}: Sets the text strings that the daemon sends to the client for
                  presentation to the user when using keyboar-interactive authentication. If  the
                  fun/3  is  used,  it  is  called  when the actual authentication occurs and may
                  therefore return dynamic data like time, remote ip etc.

                  The parameter Echo guides the client about need to hide the password.

                  The default value is: {auth_method_kb_interactive_data, {"SSH  server",  "Enter
                  password for \""++User++"\"", "password: ", false}>

                {user_passwords, [{string() = User, string() = Password}]}:
                  Provides  passwords  for  password  authentication. The passwords are used when
                  someone tries to connect to  the  server  and  public  key  user-authentication
                  fails.  The  option  provides  a  list of valid usernames and the corresponding
                  passwords.

                {password, string()}:
                  Provides a global  password  that  authenticates  any  user.  From  a  security
                  perspective this option makes the server very vulnerable.

                {preferred_algorithms, algs_list()}:
                  List of algorithms to use in the algorithm negotiation. The default algs_list()
                  can be obtained from default_algorithms/0.

                  If an alg_entry() is missing in the algs_list(), the default value is used  for
                  that entry.

                  Here is an example of this option:

                {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]}
                }

                  The example specifies different algorithms in the two directions (client2server
                  and server2client), for cipher but specifies the same algorithms  for  mac  and
                  compression  in  both  directions.  The  kex  (key  exchange)  is  implicit but
                  public_key is set explicitly.

            Warning:
                Changing the values can make a connection less secure. Do not change  unless  you
                know exactly what you are doing. If you do not understand the values then you are
                not supposed to change them.

                {dh_gex_groups,  [{Size=integer(),G=integer(),P=integer()}]  |  {file,filename()}
                {ssh_moduli_file,filename()} }:
                  Defines  the  groups  the  server  may  choose among when diffie-hellman-group-
                  exchange is negotiated. See RFC 4419 for details. The three  variants  of  this
                  option are:

                  {Size=integer(),G=integer(),P=integer()}:
                    The  groups  are given explicitly in this list. There may be several elements
                    with the same Size. In such a case, the server will choose  one  randomly  in
                    the negotiated Size.

                  {file,filename()}:
                    The      file      must      have      one      or      more     three-tuples
                    {Size=integer(),G=integer(),P=integer()} terminated by a  dot.  The  file  is
                    read when the daemon starts.

                  {ssh_moduli_file,filename()}:
                    The  file must be in ssh-keygen moduli file format. The file is read when the
                    daemon starts.

                  The default list is fetched from the public_key application.

                {dh_gex_limits,{Min=integer(),Max=integer()}}:
                  Limits what a client can ask for in diffie-hellman-group-exchange.  The  limits
                  will  be  {MaxUsed  =  min(MaxClient,Max),  MinUsed = max(MinClient,Min)} where
                  MaxClient and MinClient are the values proposed by a connecting client.

                  The default value is {0,infinity}.

                  If MaxUsed < MinUsed in a key exchange, it will fail with a disconnect.

                  See RFC 4419 for the function of the Max and Min values.

                {pwdfun,                 fun(User::string(),                  Password::string(),
                PeerAddress::{ip_adress(),port_number()}, State::any()) -> boolean() | disconnect
                | {boolean(),any()} }:
                  Provides a function for password validation. This could  used  for  calling  an
                  external system or if passwords should be stored as a hash. The fun returns:

                  * true if the user and password is valid and

                  * false otherwise.

                  This fun can also be used to make delays in authentication tries for example by
                  calling timer:sleep/1.  To  facilitate  counting  of  failed  tries  the  State
                  variable  could  be used. This state is per connection only. The first time the
                  pwdfun is called for a connection, the State variable has the value  undefined.
                  The pwdfun can return - in addition to the values above - a new state as:

                  * {true, NewState:any()} if the user and password is valid or

                  * {false, NewState:any()} if the user or password is invalid

                  A  third  usage  is to block login attempts from a missbehaving peer. The State
                  described above can be used for this. In addition to the responses  above,  the
                  following return value is introduced:

                  * disconnect  if  the  connection  should be closed immediately after sending a
                    SSH_MSG_DISCONNECT message.

                {pwdfun, fun(User::string(), Password::string()) -> boolean()}:
                  Provides a function for password validation. This function is called with  user
                  and  password  as  strings, and returns true if the password is valid and false
                  otherwise.

                  This  option  ({pwdfun,fun/2})  is  the  same  as  a  subset  of  the  previous
                  ({pwdfun,fun/4}). It is kept for compatibility.

                {negotiation_timeout, integer()}:
                  Maximum  time  in  milliseconds for the authentication negotiation. Defaults to
                  120000 (2 minutes). If the client  fails  to  log  in  within  this  time,  the
                  connection is closed.

                {max_sessions, pos_integer()}:
                  The  maximum  number of simultaneous sessions that are accepted at any time for
                  this daemon. This includes sessions that are being authorized. Thus, if set  to
                  N,  and  N clients have connected but not started the login process, connection
                  attempt N+1 is aborted. If N connections are authenticated and still logged in,
                  no more logins are accepted until one of the existing ones log out.

                  The  counter  is per listening port. Thus, if two daemons are started, one with
                  {max_sessions,N} and the other with {max_sessions,M}, in total N+M  connections
                  are accepted for the whole ssh application.

                  Notice that if parallel_login is false, only one client at a time can be in the
                  authentication phase.

                  By default, this option is not set. This means that the number is not limited.

                {max_channels, pos_integer()}:
                  The maximum number of channels with active remote subsystem that  are  accepted
                  for each connection to this daemon

                  By default, this option is not set. This means that the number is not limited.

                {parallel_login, boolean()}:
                  If  set  to  false (the default value), only one login is handled at a time. If
                  set to true, an unlimited number of login attempts are allowed simultaneously.

                  If the max_sessions option is set to N and parallel_login is set to  true,  the
                  maximum  number  of  simultaneous login attempts at any time is limited to N-K,
                  where K is the number of authenticated connections present at this daemon.

            Warning:
                Do not enable parallel_logins without protecting the server by other  means,  for
                example,  by the max_sessions option or a firewall configuration. If set to true,
                there is no protection against DOS attacks.

                {minimal_remote_max_packet_size, non_negative_integer()}:
                  The least maximum packet size that the  daemon  will  accept  in  channel  open
                  requests from the client. The default value is 0.

                {id_string, random | string()}:
                  The  string the daemon will present to a connecting peer initially. The default
                  value is "Erlang/VSN" where VSN is the ssh application version number.

                  The value random will cause a random string to be created  at  each  connection
                  attempt.  This  is to make it a bit more difficult for a malicious peer to find
                  the ssh software brand and version.

                {key_cb, key_cb()}:
                  Module implementing the behaviour ssh_server_key_api. Can be used to  customize
                  the  handling  of  public keys. If callback options are provided along with the
                  module name, they are made available to the callback  module  via  the  options
                  passed to it under the key 'key_cb_private'.

                {profile, atom()}:
                  Used  together with ip-address and port to uniquely identify a ssh daemon. This
                  can be useful in a virtualized environment, where there can be  more  that  one
                  server  that  has  the  same  ip-address  and  port.  If  this  property is not
                  explicitly set, it is  assumed  that  the  the  ip-address  and  port  uniquely
                  identifies the SSH daemon.

                {fd, file_descriptor()}:
                  Allows  an  existing  file-descriptor  to  be  used (passed on to the transport
                  protocol).

                {failfun, fun(User::string(), PeerAddress::ip_address(), Reason::term()) -> _}:
                  Provides a fun to implement your own logging when a user fails to authenticate.

                {connectfun,  fun(User::string(),  PeerAddress::ip_address(),   Method::string())
                ->_}:
                  Provides  a  fun to implement your own logging when a user authenticates to the
                  server.

                {disconnectfun, fun(Reason:term()) -> _}:
                  Provides a fun to implement your own logging when a user disconnects  from  the
                  server.

                {unexpectedfun, fun(Message:term(), Peer) -> report | skip }:
                  Provides a fun to implement your own logging or other action when an unexpected
                  message arrives. If the fun returns report the usual info report is issued  but
                  if skip is returned no report is generated.

                  Peer is in the format of {Host,Port}.

                {ssh_msg_debug_fun,                      fun(ConnectionRef::ssh_connection_ref(),
                AlwaysDisplay::boolean(), Msg::binary(), LanguageTag::binary()) -> _}:
                  Provide a fun to implement your own logging of the SSH  message  SSH_MSG_DEBUG.
                  The  last three parameters are from the message, see RFC4253, section 11.3. The
                  ConnectionRef is the reference to the connection on which the message  arrived.
                  The return value from the fun is not checked.

                  The default behaviour is ignore the message. To get a printout for each message
                  with   AlwaysDisplay   =   true,   use    for    example    {ssh_msg_debug_fun,
                  fun(_,true,M,_)-> io:format("DEBUG: ~p~n", [M]) end}

       default_algorithms() -> algs_list()

              Returns  a key-value list, where the keys are the different types of algorithms and
              the values are the algorithms themselves. An example:

              20> ssh:default_algorithms().
              [{kex,['diffie-hellman-group1-sha1']},
               {public_key,['ssh-rsa','ssh-dss']},
               {cipher,[{client2server,['aes128-ctr','aes128-cbc','3des-cbc']},
                        {server2client,['aes128-ctr','aes128-cbc','3des-cbc']}]},
               {mac,[{client2server,['hmac-sha2-256','hmac-sha1']},
                     {server2client,['hmac-sha2-256','hmac-sha1']}]},
               {compression,[{client2server,[none,zlib]},
                             {server2client,[none,zlib]}]}]
              21>

       shell(Host) ->
       shell(Host, Option) ->
       shell(Host, Port, Option) -> _

              Types:

                 Host = string()
                 Port = integer()
                 Options - see ssh:connect/3

              Starts an interactive shell over an SSH server on  the  given  Host.  The  function
              waits for user input, and does not return until the remote shell is ended (that is,
              exit from the shell).

       start() ->
       start(Type) -> ok | {error, Reason}

              Types:

                 Type = permanent | transient | temporary
                 Reason = term()

              Utility function that starts the applications crypto, public_key, and ssh.  Default
              type  is  temporary. For more information, see the application(3erl) manual page in
              kernel.

       stop() -> ok | {error, Reason}

              Types:

                 Reason = term()

              Stops the ssh application. For more information, see the  application(3erl)  manual
              page in kernel.

       stop_daemon(DaemonRef) ->
       stop_daemon(Address, Port) -> ok

              Types:

                 DaemonRef = ssh_daemon_ref()
                 Address = ip_address()
                 Port = integer()

              Stops the listener and all connections started by the listener.

       stop_listener(DaemonRef) ->
       stop_listener(Address, Port) -> ok

              Types:

                 DaemonRef = ssh_daemon_ref()
                 Address = ip_address()
                 Port = integer()

              Stops  the  listener,  but  leaves  existing  connections  started  by the listener
              operational.