SSHD(8)                     System Manager's Manual                    SSHD(8)

NAME
     sshd M-bM-^@M-^S OpenSSH SSH daemon

SYNOPSIS
     sshd [-46DdeiqTt] [-C connection_spec] [-c host_certificate_file]
          [-E log_file] [-f config_file] [-g login_grace_time]
          [-h host_key_file] [-o option] [-p port] [-u len]

DESCRIPTION
     sshd (OpenSSH Daemon) is the daemon program for ssh(1).  Together these
     programs replace rlogin and rsh, and provide secure encrypted
     communications between two untrusted hosts over an insecure network.

     sshd listens for connections from clients.  It is normally started at
     boot from /etc/rc.  It forks a new daemon for each incoming connection.
     The forked daemons handle key exchange, encryption, authentication,
     command execution, and data exchange.

     sshd can be configured using command-line options or a configuration file
     (by default sshd_config(5)); command-line options override values
     specified in the configuration file.  sshd rereads its configuration file
     when it receives a hangup signal, SIGHUP, by executing itself with the
     name and options it was started with, e.g. /usr/sbin/sshd.

     The options are as follows:

     -4      Forces sshd to use IPv4 addresses only.

     -6      Forces sshd to use IPv6 addresses only.

     -C connection_spec
             Specify the connection parameters to use for the -T extended test
             mode.  If provided, any Match directives in the configuration
             file that would apply to the specified user, host, and address
             will be set before the configuration is written to standard
             output.  The connection parameters are supplied as keyword=value
             pairs.  The keywords are M-bM-^@M-^\userM-bM-^@M-^], M-bM-^@M-^\hostM-bM-^@M-^], M-bM-^@M-^\laddrM-bM-^@M-^], M-bM-^@M-^\lportM-bM-^@M-^], and
             M-bM-^@M-^\addrM-bM-^@M-^].  All are required and may be supplied in any order,
             either with multiple -C options or as a comma-separated list.

     -c host_certificate_file
             Specifies a path to a certificate file to identify sshd during
             key exchange.  The certificate file must match a host key file
             specified using the -h option or the HostKey configuration
             directive.

     -D      When this option is specified, sshd will not detach and does not
             become a daemon.  This allows easy monitoring of sshd.

     -d      Debug mode.  The server sends verbose debug output to standard
             error, and does not put itself in the background.  The server
             also will not fork and will only process one connection.  This
             option is only intended for debugging for the server.  Multiple
             -d options increase the debugging level.  Maximum is 3.

     -E log_file
             Append debug logs to log_file instead of the system log.

     -e      Write debug logs to standard error instead of the system log.

     -f config_file
             Specifies the name of the configuration file.  The default is
             /etc/ssh/sshd_config.  sshd refuses to start if there is no
             configuration file.

     -g login_grace_time
             Gives the grace time for clients to authenticate themselves
             (default 120 seconds).  If the client fails to authenticate the
             user within this many seconds, the server disconnects and exits.
             A value of zero indicates no limit.

     -h host_key_file
             Specifies a file from which a host key is read.  This option must
             be given if sshd is not run as root (as the normal host key files
             are normally not readable by anyone but root).  The default is
             /etc/ssh/ssh_host_dsa_key, /etc/ssh/ssh_host_ecdsa_key,
             /etc/ssh/ssh_host_ed25519_key and /etc/ssh/ssh_host_rsa_key.  It
             is possible to have multiple host key files for the different
             host key algorithms.

     -i      Specifies that sshd is being run from inetd(8).

     -o option
             Can be used to give options in the format used in the
             configuration file.  This is useful for specifying options for
             which there is no separate command-line flag.  For full details
             of the options, and their values, see sshd_config(5).

     -p port
             Specifies the port on which the server listens for connections
             (default 22).  Multiple port options are permitted.  Ports
             specified in the configuration file with the Port option are
             ignored when a command-line port is specified.  Ports specified
             using the ListenAddress option override command-line ports.

     -q      Quiet mode.  Nothing is sent to the system log.  Normally the
             beginning, authentication, and termination of each connection is
             logged.

     -T      Extended test mode.  Check the validity of the configuration
             file, output the effective configuration to stdout and then exit.
             Optionally, Match rules may be applied by specifying the
             connection parameters using one or more -C options.

     -t      Test mode.  Only check the validity of the configuration file and
             sanity of the keys.  This is useful for updating sshd reliably as
             configuration options may change.

     -u len  This option is used to specify the size of the field in the utmp
             structure that holds the remote host name.  If the resolved host
             name is longer than len, the dotted decimal value will be used
             instead.  This allows hosts with very long host names that
             overflow this field to still be uniquely identified.  Specifying
             -u0 indicates that only dotted decimal addresses should be put
             into the utmp file.  -u0 may also be used to prevent sshd from
             making DNS requests unless the authentication mechanism or
             configuration requires it.  Authentication mechanisms that may
             require DNS include HostbasedAuthentication and using a
             from="pattern-list" option in a key file.  Configuration options
             that require DNS include using a USER@HOST pattern in AllowUsers
             or DenyUsers.

AUTHENTICATION
     The OpenSSH SSH daemon supports SSH protocol 2 only.  Each host has a
     host-specific key, used to identify the host.  Whenever a client
     connects, the daemon responds with its public host key.  The client
     compares the host key against its own database to verify that it has not
     changed.  Forward security is provided through a Diffie-Hellman key
     agreement.  This key agreement results in a shared session key.  The rest
     of the session is encrypted using a symmetric cipher, currently 128-bit
     AES, Blowfish, 3DES, CAST128, Arcfour, 192-bit AES, or 256-bit AES.  The
     client selects the encryption algorithm to use from those offered by the
     server.  Additionally, session integrity is provided through a
     cryptographic message authentication code (hmac-md5, hmac-sha1, umac-64,
     umac-128, hmac-ripemd160, hmac-sha2-256 or hmac-sha2-512).

     Finally, the server and the client enter an authentication dialog.  The
     client tries to authenticate itself using host-based authentication,
     public key authentication, challenge-response authentication, or password
     authentication.

     Regardless of the authentication type, the account is checked to ensure
     that it is accessible.  An account is not accessible if it is locked,
     listed in DenyUsers or its group is listed in DenyGroups .  The
     definition of a locked account is system dependant. Some platforms have
     their own account database (eg AIX) and some modify the passwd field (
     M-bM-^@M-^X*LK*M-bM-^@M-^Y on Solaris and UnixWare, M-bM-^@M-^X*M-bM-^@M-^Y on HP-UX, containing M-bM-^@M-^XNologinM-bM-^@M-^Y on
     Tru64, a leading M-bM-^@M-^X*LOCKED*M-bM-^@M-^Y on FreeBSD and a leading M-bM-^@M-^X!M-bM-^@M-^Y on most
     Linuxes).  If there is a requirement to disable password authentication
     for the account while allowing still public-key, then the passwd field
     should be set to something other than these values (eg M-bM-^@M-^XNPM-bM-^@M-^Y or M-bM-^@M-^X*NP*M-bM-^@M-^Y ).

     If the client successfully authenticates itself, a dialog for preparing
     the session is entered.  At this time the client may request things like
     allocating a pseudo-tty, forwarding X11 connections, forwarding TCP
     connections, or forwarding the authentication agent connection over the
     secure channel.

     After this, the client either requests a shell or execution of a command.
     The sides then enter session mode.  In this mode, either side may send
     data at any time, and such data is forwarded to/from the shell or command
     on the server side, and the user terminal in the client side.

     When the user program terminates and all forwarded X11 and other
     connections have been closed, the server sends command exit status to the
     client, and both sides exit.

LOGIN PROCESS
     When a user successfully logs in, sshd does the following:

           1.   If the login is on a tty, and no command has been specified,
                prints last login time and /etc/motd (unless prevented in the
                configuration file or by ~/.hushlogin; see the FILES section).

           2.   If the login is on a tty, records login time.

           3.   Checks /etc/nologin; if it exists, prints contents and quits
                (unless root).

           4.   Changes to run with normal user privileges.

           5.   Sets up basic environment.

           6.   Reads the file ~/.ssh/environment, if it exists, and users are
                allowed to change their environment.  See the
                PermitUserEnvironment option in sshd_config(5).

           7.   Changes to user's home directory.

           8.   If ~/.ssh/rc exists and the sshd_config(5) PermitUserRC option
                is set, runs it; else if /etc/ssh/sshrc exists, runs it;
                otherwise runs xauth.  The M-bM-^@M-^\rcM-bM-^@M-^] files are given the X11
                authentication protocol and cookie in standard input.  See
                SSHRC, below.

           9.   Runs user's shell or command.  All commands are run under the
                user's login shell as specified in the system password
                database.

SSHRC
     If the file ~/.ssh/rc exists, sh(1) runs it after reading the environment
     files but before starting the user's shell or command.  It must not
     produce any output on stdout; stderr must be used instead.  If X11
     forwarding is in use, it will receive the "proto cookie" pair in its
     standard input (and DISPLAY in its environment).  The script must call
     xauth(1) because sshd will not run xauth automatically to add X11
     cookies.

     The primary purpose of this file is to run any initialization routines
     which may be needed before the user's home directory becomes accessible;
     AFS is a particular example of such an environment.

     This file will probably contain some initialization code followed by
     something similar to:

        if read proto cookie && [ -n "$DISPLAY" ]; then
                if [ `echo $DISPLAY | cut -c1-10` = 'localhost:' ]; then
                        # X11UseLocalhost=yes
                        echo add unix:`echo $DISPLAY |
                            cut -c11-` $proto $cookie
                else
                        # X11UseLocalhost=no
                        echo add $DISPLAY $proto $cookie
                fi | xauth -q -
        fi

     If this file does not exist, /etc/ssh/sshrc is run, and if that does not
     exist either, xauth is used to add the cookie.

AUTHORIZED_KEYS FILE FORMAT
     AuthorizedKeysFile specifies the files containing public keys for public
     key authentication; if this option is not specified, the default is
     ~/.ssh/authorized_keys and ~/.ssh/authorized_keys2.  Each line of the
     file contains one key (empty lines and lines starting with a M-bM-^@M-^X#M-bM-^@M-^Y are
     ignored as comments).  Public keys consist of the following space-
     separated fields: options, keytype, base64-encoded key, comment.  The
     options field is optional.  The keytype is M-bM-^@M-^\ecdsa-sha2-nistp256M-bM-^@M-^],
     M-bM-^@M-^\ecdsa-sha2-nistp384M-bM-^@M-^], M-bM-^@M-^\ecdsa-sha2-nistp521M-bM-^@M-^], M-bM-^@M-^\ssh-ed25519M-bM-^@M-^], M-bM-^@M-^\ssh-dssM-bM-^@M-^] or
     M-bM-^@M-^\ssh-rsaM-bM-^@M-^]; the comment field is not used for anything (but may be
     convenient for the user to identify the key).

     Note that lines in this file can be several hundred bytes long (because
     of the size of the public key encoding) up to a limit of 8 kilobytes,
     which permits DSA keys up to 8 kilobits and RSA keys up to 16 kilobits.
     You don't want to type them in; instead, copy the id_dsa.pub,
     id_ecdsa.pub, id_ed25519.pub, or the id_rsa.pub file and edit it.

     sshd enforces a minimum RSA key modulus size of 768 bits.

     The options (if present) consist of comma-separated option
     specifications.  No spaces are permitted, except within double quotes.
     The following option specifications are supported (note that option
     keywords are case-insensitive):

     agent-forwarding
             Enable authentication agent forwarding previously disabled by the
             restrict option.

     cert-authority
             Specifies that the listed key is a certification authority (CA)
             that is trusted to validate signed certificates for user
             authentication.

             Certificates may encode access restrictions similar to these key
             options.  If both certificate restrictions and key options are
             present, the most restrictive union of the two is applied.

     command="command"
             Specifies that the command is executed whenever this key is used
             for authentication.  The command supplied by the user (if any) is
             ignored.  The command is run on a pty if the client requests a
             pty; otherwise it is run without a tty.  If an 8-bit clean
             channel is required, one must not request a pty or should specify
             no-pty.  A quote may be included in the command by quoting it
             with a backslash.

             This option might be useful to restrict certain public keys to
             perform just a specific operation.  An example might be a key
             that permits remote backups but nothing else.  Note that the
             client may specify TCP and/or X11 forwarding unless they are
             explicitly prohibited, e.g. using the restrict key option.

             The command originally supplied by the client is available in the
             SSH_ORIGINAL_COMMAND environment variable.  Note that this option
             applies to shell, command or subsystem execution.  Also note that
             this command may be superseded by a sshd_config(5) ForceCommand
             directive.

             If a command is specified and a forced-command is embedded in a
             certificate used for authentication, then the certificate will be
             accepted only if the two commands are identical.

     environment="NAME=value"
             Specifies that the string is to be added to the environment when
             logging in using this key.  Environment variables set this way
             override other default environment values.  Multiple options of
             this type are permitted.  Environment processing is disabled by
             default and is controlled via the PermitUserEnvironment option.

     from="pattern-list"
             Specifies that in addition to public key authentication, either
             the canonical name of the remote host or its IP address must be
             present in the comma-separated list of patterns.  See PATTERNS in
             ssh_config(5) for more information on patterns.

             In addition to the wildcard matching that may be applied to
             hostnames or addresses, a from stanza may match IP addresses
             using CIDR address/masklen notation.

             The purpose of this option is to optionally increase security:
             public key authentication by itself does not trust the network or
             name servers or anything (but the key); however, if somebody
             somehow steals the key, the key permits an intruder to log in
             from anywhere in the world.  This additional option makes using a
             stolen key more difficult (name servers and/or routers would have
             to be compromised in addition to just the key).

     no-agent-forwarding
             Forbids authentication agent forwarding when this key is used for
             authentication.

     no-port-forwarding
             Forbids TCP forwarding when this key is used for authentication.
             Any port forward requests by the client will return an error.
             This might be used, e.g. in connection with the command option.

     no-pty  Prevents tty allocation (a request to allocate a pty will fail).

     no-user-rc
             Disables execution of ~/.ssh/rc.

     no-X11-forwarding
             Forbids X11 forwarding when this key is used for authentication.
             Any X11 forward requests by the client will return an error.

     permitopen="host:port"
             Limit local port forwarding with ssh(1) -L such that it may only
             connect to the specified host and port.  IPv6 addresses can be
             specified by enclosing the address in square brackets.  Multiple
             permitopen options may be applied separated by commas.  No
             pattern matching is performed on the specified hostnames, they
             must be literal domains or addresses.  A port specification of *
             matches any port.

     port-forwarding
             Enable port forwarding previously disabled by the restrict

     principals="principals"
             On a cert-authority line, specifies allowed principals for
             certificate authentication as a comma-separated list.  At least
             one name from the list must appear in the certificate's list of
             principals for the certificate to be accepted.  This option is
             ignored for keys that are not marked as trusted certificate
             signers using the cert-authority option.

     pty     Permits tty allocation previously disabled by the restrict
             option.

     restrict
             Enable all restrictions, i.e. disable port, agent and X11
             forwarding, as well as disabling PTY allocation and execution of
             ~/.ssh/rc.  If any future restriction capabilities are added to
             authorized_keys files they will be included in this set.

     tunnel="n"
             Force a tun(4) device on the server.  Without this option, the
             next available device will be used if the client requests a
             tunnel.

     user-rc
             Enables execution of ~/.ssh/rc previously disabled by the
             restrict option.

     X11-forwarding
             Permits X11 forwarding previously disabled by the restrict
             option.

     An example authorized_keys file:

        # Comments allowed at start of line
        ssh-rsa AAAAB3Nza...LiPk== user@example.net
        from="*.sales.example.net,!pc.sales.example.net" ssh-rsa
        AAAAB2...19Q== john@example.net
        command="dump /home",no-pty,no-port-forwarding ssh-dss
        AAAAC3...51R== example.net
        permitopen="192.0.2.1:80",permitopen="192.0.2.2:25" ssh-dss
        AAAAB5...21S==
        tunnel="0",command="sh /etc/netstart tun0" ssh-rsa AAAA...==
        jane@example.net
        restrict,command="uptime" ssh-rsa AAAA1C8...32Tv==
        user@example.net
        restrict,pty,command="nethack" ssh-rsa AAAA1f8...IrrC5==
        user@example.net

SSH_KNOWN_HOSTS FILE FORMAT
     The /etc/ssh/ssh_known_hosts and ~/.ssh/known_hosts files contain host
     public keys for all known hosts.  The global file should be prepared by
     the administrator (optional), and the per-user file is maintained
     automatically: whenever the user connects to an unknown host, its key is
     added to the per-user file.

     Each line in these files contains the following fields: markers
     (optional), hostnames, keytype, base64-encoded key, comment.  The fields
     are separated by spaces.

     The marker is optional, but if it is present then it must be one of
     M-bM-^@M-^\@cert-authorityM-bM-^@M-^], to indicate that the line contains a certification
     authority (CA) key, or M-bM-^@M-^\@revokedM-bM-^@M-^], to indicate that the key contained on
     the line is revoked and must not ever be accepted.  Only one marker
     should be used on a key line.

     Hostnames is a comma-separated list of patterns (M-bM-^@M-^X*M-bM-^@M-^Y and M-bM-^@M-^X?M-bM-^@M-^Y act as
     wildcards); each pattern in turn is matched against the canonical host
     name (when authenticating a client) or against the user-supplied name
     (when authenticating a server).  A pattern may also be preceded by M-bM-^@M-^X!M-bM-^@M-^Y to
     indicate negation: if the host name matches a negated pattern, it is not
     accepted (by that line) even if it matched another pattern on the line.
     A hostname or address may optionally be enclosed within M-bM-^@M-^X[M-bM-^@M-^Y and M-bM-^@M-^X]M-bM-^@M-^Y
     brackets then followed by M-bM-^@M-^X:M-bM-^@M-^Y and a non-standard port number.

     Alternately, hostnames may be stored in a hashed form which hides host
     names and addresses should the file's contents be disclosed.  Hashed
     hostnames start with a M-bM-^@M-^X|M-bM-^@M-^Y character.  Only one hashed hostname may
     appear on a single line and none of the above negation or wildcard
     operators may be applied.

     The keytype and base64-encoded key are taken directly from the host key;
     they can be obtained, for example, from /etc/ssh/ssh_host_rsa_key.pub.
     The optional comment field continues to the end of the line, and is not
     used.

     Lines starting with M-bM-^@M-^X#M-bM-^@M-^Y and empty lines are ignored as comments.

     When performing host authentication, authentication is accepted if any
     matching line has the proper key; either one that matches exactly or, if
     the server has presented a certificate for authentication, the key of the
     certification authority that signed the certificate.  For a key to be
     trusted as a certification authority, it must use the M-bM-^@M-^\@cert-authorityM-bM-^@M-^]
     marker described above.

     The known hosts file also provides a facility to mark keys as revoked,
     for example when it is known that the associated private key has been
     stolen.  Revoked keys are specified by including the M-bM-^@M-^\@revokedM-bM-^@M-^] marker at
     the beginning of the key line, and are never accepted for authentication
     or as certification authorities, but instead will produce a warning from
     ssh(1) when they are encountered.

     It is permissible (but not recommended) to have several lines or
     different host keys for the same names.  This will inevitably happen when
     short forms of host names from different domains are put in the file.  It
     is possible that the files contain conflicting information;
     authentication is accepted if valid information can be found from either
     file.

     Note that the lines in these files are typically hundreds of characters
     long, and you definitely don't want to type in the host keys by hand.
     Rather, generate them by a script, ssh-keyscan(1) or by taking, for
     example, /etc/ssh/ssh_host_rsa_key.pub and adding the host names at the
     front.  ssh-keygen(1) also offers some basic automated editing for
     ~/.ssh/known_hosts including removing hosts matching a host name and
     converting all host names to their hashed representations.

     An example ssh_known_hosts file:

        # Comments allowed at start of line
        closenet,...,192.0.2.53 1024 37 159...93 closenet.example.net
        cvs.example.net,192.0.2.10 ssh-rsa AAAA1234.....=
        # A hashed hostname
        |1|JfKTdBh7rNbXkVAQCRp4OQoPfmI=|USECr3SWf1JUPsms5AqfD5QfxkM= ssh-rsa
        AAAA1234.....=
        # A revoked key
        @revoked * ssh-rsa AAAAB5W...
        # A CA key, accepted for any host in *.mydomain.com or *.mydomain.org
        @cert-authority *.mydomain.org,*.mydomain.com ssh-rsa AAAAB5W...

FILES
     ~/.hushlogin
             This file is used to suppress printing the last login time and
             /etc/motd, if PrintLastLog and PrintMotd, respectively, are
             enabled.  It does not suppress printing of the banner specified
             by Banner.

     ~/.rhosts
             This file is used for host-based authentication (see ssh(1) for
             more information).  On some machines this file may need to be
             world-readable if the user's home directory is on an NFS
             partition, because sshd reads it as root.  Additionally, this
             file must be owned by the user, and must not have write
             permissions for anyone else.  The recommended permission for most
             machines is read/write for the user, and not accessible by
             others.

     ~/.shosts
             This file is used in exactly the same way as .rhosts, but allows
             host-based authentication without permitting login with
             rlogin/rsh.

     ~/.ssh/
             This directory is the default location for all user-specific
             configuration and authentication information.  There is no
             general requirement to keep the entire contents of this directory
             secret, but the recommended permissions are read/write/execute
             for the user, and not accessible by others.

     ~/.ssh/authorized_keys
             Lists the public keys (DSA, ECDSA, Ed25519, RSA) that can be used
             for logging in as this user.  The format of this file is
             described above.  The content of the file is not highly
             sensitive, but the recommended permissions are read/write for the
             user, and not accessible by others.

             If this file, the ~/.ssh directory, or the user's home directory
             are writable by other users, then the file could be modified or
             replaced by unauthorized users.  In this case, sshd will not
             allow it to be used unless the StrictModes option has been set to
             M-bM-^@M-^\noM-bM-^@M-^].

     ~/.ssh/environment
             This file is read into the environment at login (if it exists).
             It can only contain empty lines, comment lines (that start with
             M-bM-^@M-^X#M-bM-^@M-^Y), and assignment lines of the form name=value.  The file
             should be writable only by the user; it need not be readable by
             anyone else.  Environment processing is disabled by default and
             is controlled via the PermitUserEnvironment option.

     ~/.ssh/known_hosts
             Contains a list of host keys for all hosts the user has logged
             into that are not already in the systemwide list of known host
             keys.  The format of this file is described above.  This file
             should be writable only by root/the owner and can, but need not
             be, world-readable.

     ~/.ssh/rc
             Contains initialization routines to be run before the user's home
             directory becomes accessible.  This file should be writable only
             by the user, and need not be readable by anyone else.

     /etc/hosts.equiv
             This file is for host-based authentication (see ssh(1)).  It
             should only be writable by root.

     /etc/moduli
             Contains Diffie-Hellman groups used for the "Diffie-Hellman Group
             Exchange" key exchange method.  The file format is described in
             moduli(5).  If no usable groups are found in this file then fixed
             internal groups will be used.

     /etc/motd
             See motd(5).

     /etc/nologin
             If this file exists, sshd refuses to let anyone except root log
             in.  The contents of the file are displayed to anyone trying to
             log in, and non-root connections are refused.  The file should be
             world-readable.

     /etc/shosts.equiv
             This file is used in exactly the same way as hosts.equiv, but
             allows host-based authentication without permitting login with
             rlogin/rsh.

     /etc/ssh/ssh_host_dsa_key
     /etc/ssh/ssh_host_ecdsa_key
     /etc/ssh/ssh_host_ed25519_key
     /etc/ssh/ssh_host_rsa_key
             These files contain the private parts of the host keys.  These
             files should only be owned by root, readable only by root, and
             not accessible to others.  Note that sshd does not start if these
             files are group/world-accessible.

     /etc/ssh/ssh_host_dsa_key.pub
     /etc/ssh/ssh_host_ecdsa_key.pub
     /etc/ssh/ssh_host_ed25519_key.pub
     /etc/ssh/ssh_host_rsa_key.pub
             These files contain the public parts of the host keys.  These
             files should be world-readable but writable only by root.  Their
             contents should match the respective private parts.  These files
             are not really used for anything; they are provided for the
             convenience of the user so their contents can be copied to known
             hosts files.  These files are created using ssh-keygen(1).

     /etc/ssh/ssh_known_hosts
             Systemwide list of known host keys.  This file should be prepared
             by the system administrator to contain the public host keys of
             all machines in the organization.  The format of this file is
             described above.  This file should be writable only by root/the
             owner and should be world-readable.

     /etc/ssh/sshd_config
             Contains configuration data for sshd.  The file format and
             configuration options are described in sshd_config(5).

     /etc/ssh/sshrc
             Similar to ~/.ssh/rc, it can be used to specify machine-specific
             login-time initializations globally.  This file should be
             writable only by root, and should be world-readable.

     /var/empty
             chroot(2) directory used by sshd during privilege separation in
             the pre-authentication phase.  The directory should not contain
             any files and must be owned by root and not group or world-
             writable.

     /var/run/sshd.pid
             Contains the process ID of the sshd listening for connections (if
             there are several daemons running concurrently for different
             ports, this contains the process ID of the one started last).
             The content of this file is not sensitive; it can be world-
             readable.

SEE ALSO
     scp(1), sftp(1), ssh(1), ssh-add(1), ssh-agent(1), ssh-keygen(1),
     ssh-keyscan(1), chroot(2), login.conf(5), moduli(5), sshd_config(5),
     inetd(8), sftp-server(8)

AUTHORS
     OpenSSH is a derivative of the original and free ssh 1.2.12 release by
     Tatu Ylonen.  Aaron Campbell, Bob Beck, Markus Friedl, Niels Provos, Theo
     de Raadt and Dug Song removed many bugs, re-added newer features and
     created OpenSSH.  Markus Friedl contributed the support for SSH protocol
     versions 1.5 and 2.0.  Niels Provos and Markus Friedl contributed support
     for privilege separation.

OpenBSD 6.0                    January 30, 2017                    OpenBSD 6.0
