summaryrefslogtreecommitdiffstats
path: root/libssh/doc/guided_tour.dox
diff options
context:
space:
mode:
Diffstat (limited to 'libssh/doc/guided_tour.dox')
-rw-r--r--libssh/doc/guided_tour.dox455
1 files changed, 0 insertions, 455 deletions
diff --git a/libssh/doc/guided_tour.dox b/libssh/doc/guided_tour.dox
deleted file mode 100644
index 2fa906e0..00000000
--- a/libssh/doc/guided_tour.dox
+++ /dev/null
@@ -1,455 +0,0 @@
-/**
-@page libssh_tutor_guided_tour Chapter 1: A typical SSH session
-@section ssh_session A typical SSH session
-
-A SSH session goes through the following steps:
-
- - Before connecting to the server, you can set up if you wish one or other
- server public key authentication, i.e. DSA or RSA. You can choose
- cryptographic algorithms you trust and compression algorithms if any. You
- must of course set up the hostname.
-
- - The connection is established. A secure handshake is made, and resulting from
- it, a public key from the server is gained. You MUST verify that the public
- key is legitimate, using for instance the MD5 fingerprint or the known hosts
- file.
-
- - The client must authenticate: the classical ways are password, or
- public keys (from dsa and rsa key-pairs generated by openssh).
- If a SSH agent is running, it is possible to use it.
-
- - Now that the user has been authenticated, you must open one or several
- channels. Channels are different subways for information into a single ssh
- connection. Each channel has a standard stream (stdout) and an error stream
- (stderr). You can theoretically open an infinity of channels.
-
- - With the channel you opened, you can do several things:
- - Execute a single command.
- - Open a shell. You may want to request a pseudo-terminal before.
- - Invoke the sftp subsystem to transfer files.
- - Invoke the scp subsystem to transfer files.
- - Invoke your own subsystem. This is outside the scope of this document,
- but can be done.
-
- - When everything is finished, just close the channels, and then the connection.
-
-The sftp and scp subsystems use channels, but libssh hides them to
-the programmer. If you want to use those subsystems, instead of a channel,
-you'll usually open a "sftp session" or a "scp session".
-
-
-@subsection setup Creating the session and setting options
-
-The most important object in a SSH connection is the SSH session. In order
-to allocate a new SSH session, you use ssh_new(). Don't forget to
-always verify that the allocation successed.
-@code
-#include <libssh/libssh.h>
-#include <stdlib.h>
-
-int main()
-{
- ssh_session my_ssh_session = ssh_new();
- if (my_ssh_session == NULL)
- exit(-1);
- ...
- ssh_free(my_ssh_session);
-}
-@endcode
-
-libssh follows the allocate-it-deallocate-it pattern. Each object that you allocate
-using xxxxx_new() must be deallocated using xxxxx_free(). In this case, ssh_new()
-does the allocation and ssh_free() does the contrary.
-
-The ssh_options_set() function sets the options of the session. The most important options are:
- - SSH_OPTIONS_HOST: the name of the host you want to connect to
- - SSH_OPTIONS_PORT: the used port (default is port 22)
- - SSH_OPTIONS_USER: the system user under which you want to connect
- - SSH_OPTIONS_LOG_VERBOSITY: the quantity of messages that are printed
-
-The complete list of options can be found in the documentation of ssh_options_set().
-The only mandatory option is SSH_OPTIONS_HOST. If you don't use SSH_OPTIONS_USER,
-the local username of your account will be used.
-
-Here is a small example of how to use it:
-
-@code
-#include <libssh/libssh.h>
-#include <stdlib.h>
-
-int main()
-{
- ssh_session my_ssh_session;
- int verbosity = SSH_LOG_PROTOCOL;
- int port = 22;
-
- my_ssh_session = ssh_new();
- if (my_ssh_session == NULL)
- exit(-1);
-
- ssh_options_set(my_ssh_session, SSH_OPTIONS_HOST, "localhost");
- ssh_options_set(my_ssh_session, SSH_OPTIONS_LOG_VERBOSITY, &verbosity);
- ssh_options_set(my_ssh_session, SSH_OPTIONS_PORT, &port);
-
- ...
-
- ssh_free(my_ssh_session);
-}
-@endcode
-
-Please notice that all parameters are passed to ssh_options_set() as pointers,
-even if you need to set an integer value.
-
-@see ssh_new
-@see ssh_free
-@see ssh_options_set
-@see ssh_options_parse_config
-@see ssh_options_copy
-@see ssh_options_getopt
-
-
-@subsection connect Connecting to the server
-
-Once all settings have been made, you can connect using ssh_connect(). That
-function will return SSH_OK if the connection worked, SSH_ERROR otherwise.
-
-You can get the English error string with ssh_get_error() in order to show the
-user what went wrong. Then, use ssh_disconnect() when you want to stop
-the session.
-
-Here's an example:
-
-@code
-#include <libssh/libssh.h>
-#include <stdlib.h>
-#include <stdio.h>
-
-int main()
-{
- ssh_session my_ssh_session;
- int rc;
-
- my_ssh_session = ssh_new();
- if (my_ssh_session == NULL)
- exit(-1);
-
- ssh_options_set(my_ssh_session, SSH_OPTIONS_HOST, "localhost");
-
- rc = ssh_connect(my_ssh_session);
- if (rc != SSH_OK)
- {
- fprintf(stderr, "Error connecting to localhost: %s\n",
- ssh_get_error(my_ssh_session));
- exit(-1);
- }
-
- ...
-
- ssh_disconnect(my_ssh_session);
- ssh_free(my_ssh_session);
-}
-@endcode
-
-
-@subsection serverauth Authenticating the server
-
-Once you're connected, the following step is mandatory: you must check that the server
-you just connected to is known and safe to use (remember, SSH is about security and
-authentication).
-
-There are two ways of doing this:
- - The first way (recommended) is to use the ssh_is_server_known()
- function. This function will look into the known host file
- (~/.ssh/known_hosts on UNIX), look for the server hostname's pattern,
- and determine whether this host is present or not in the list.
- - The second way is to use ssh_get_pubkey_hash() to get a binary version
- of the public key hash value. You can then use your own database to check
- if this public key is known and secure.
-
-You can also use the ssh_get_pubkey_hash() to show the public key hash
-value to the user, in case he knows what the public key hash value is
-(some paranoid people write their public key hash values on paper before
-going abroad, just in case ...).
-
-If the remote host is being used to for the first time, you can ask the user whether
-he/she trusts it. Once he/she concluded that the host is valid and worth being
-added in the known hosts file, you use ssh_write_knownhost() to register it in
-the known hosts file, or any other way if you use your own database.
-
-The following example is part of the examples suite available in the
-examples/ directory:
-
-@code
-#include <errno.h>
-#include <string.h>
-
-int verify_knownhost(ssh_session session)
-{
- int state, hlen;
- unsigned char *hash = NULL;
- char *hexa;
- char buf[10];
-
- state = ssh_is_server_known(session);
-
- hlen = ssh_get_pubkey_hash(session, &hash);
- if (hlen < 0)
- return -1;
-
- switch (state)
- {
- case SSH_SERVER_KNOWN_OK:
- break; /* ok */
-
- case SSH_SERVER_KNOWN_CHANGED:
- fprintf(stderr, "Host key for server changed: it is now:\n");
- ssh_print_hexa("Public key hash", hash, hlen);
- fprintf(stderr, "For security reasons, connection will be stopped\n");
- free(hash);
- return -1;
-
- case SSH_SERVER_FOUND_OTHER:
- fprintf(stderr, "The host key for this server was not found but an other"
- "type of key exists.\n");
- fprintf(stderr, "An attacker might change the default server key to"
- "confuse your client into thinking the key does not exist\n");
- free(hash);
- return -1;
-
- case SSH_SERVER_FILE_NOT_FOUND:
- fprintf(stderr, "Could not find known host file.\n");
- fprintf(stderr, "If you accept the host key here, the file will be"
- "automatically created.\n");
- /* fallback to SSH_SERVER_NOT_KNOWN behavior */
-
- case SSH_SERVER_NOT_KNOWN:
- hexa = ssh_get_hexa(hash, hlen);
- fprintf(stderr,"The server is unknown. Do you trust the host key?\n");
- fprintf(stderr, "Public key hash: %s\n", hexa);
- free(hexa);
- if (fgets(buf, sizeof(buf), stdin) == NULL)
- {
- free(hash);
- return -1;
- }
- if (strncasecmp(buf, "yes", 3) != 0)
- {
- free(hash);
- return -1;
- }
- if (ssh_write_knownhost(session) < 0)
- {
- fprintf(stderr, "Error %s\n", strerror(errno));
- free(hash);
- return -1;
- }
- break;
-
- case SSH_SERVER_ERROR:
- fprintf(stderr, "Error %s", ssh_get_error(session));
- free(hash);
- return -1;
- }
-
- free(hash);
- return 0;
-}
-@endcode
-
-@see ssh_connect
-@see ssh_disconnect
-@see ssh_get_error
-@see ssh_get_error_code
-@see ssh_get_pubkey_hash
-@see ssh_is_server_known
-@see ssh_write_knownhost
-
-
-@subsection auth Authenticating the user
-
-The authentication process is the way a service provider can identify a
-user and verify his/her identity. The authorization process is about enabling
-the authenticated user the access to ressources. In SSH, the two concepts
-are linked. After authentication, the server can grant the user access to
-several ressources such as port forwarding, shell, sftp subsystem, and so on.
-
-libssh supports several methods of authentication:
- - "none" method. This method allows to get the available authentications
- methods. It also gives the server a chance to authenticate the user with
- just his/her login. Some very old hardware uses this feature to fallback
- the user on a "telnet over SSH" style of login.
- - password method. A password is sent to the server, which accepts it or not.
- - keyboard-interactive method. The server sends several challenges to the
- user, who must answer correctly. This makes possible the authentication
- via a codebook for instance ("give code at 23:R on page 3").
- - public key method. The host knows the public key of the user, and the
- user must prove he knows the associated private key. This can be done
- manually, or delegated to the SSH agent as we'll see later.
-
-All these methods can be combined. You can for instance force the user to
-authenticate with at least two of the authentication methods. In that case,
-one speaks of "Partial authentication". A partial authentication is a
-response from authentication functions stating that your credential was
-accepted, but yet another one is required to get in.
-
-The example below shows an authentication with password:
-
-@code
-#include <libssh/libssh.h>
-#include <stdlib.h>
-#include <stdio.h>
-
-int main()
-{
- ssh_session my_ssh_session;
- int rc;
- char *password;
-
- // Open session and set options
- my_ssh_session = ssh_new();
- if (my_ssh_session == NULL)
- exit(-1);
- ssh_options_set(my_ssh_session, SSH_OPTIONS_HOST, "localhost");
-
- // Connect to server
- rc = ssh_connect(my_ssh_session);
- if (rc != SSH_OK)
- {
- fprintf(stderr, "Error connecting to localhost: %s\n",
- ssh_get_error(my_ssh_session));
- ssh_free(my_ssh_session);
- exit(-1);
- }
-
- // Verify the server's identity
- // For the source code of verify_knowhost(), check previous example
- if (verify_knownhost(my_ssh_session) < 0)
- {
- ssh_disconnect(my_ssh_session);
- ssh_free(my_ssh_session);
- exit(-1);
- }
-
- // Authenticate ourselves
- password = getpass("Password: ");
- rc = ssh_userauth_password(my_ssh_session, NULL, password);
- if (rc != SSH_AUTH_SUCCESS)
- {
- fprintf(stderr, "Error authenticating with password: %s\n",
- ssh_get_error(my_ssh_session));
- ssh_disconnect(my_ssh_session);
- ssh_free(my_ssh_session);
- exit(-1);
- }
-
- ...
-
- ssh_disconnect(my_ssh_session);
- ssh_free(my_ssh_session);
-}
-@endcode
-
-@see @ref authentication_details
-
-
-@subsection using_ssh Doing something
-
-At this point, the authenticity of both server and client is established.
-Time has come to take advantage of the many possibilities offered by the SSH
-protocol: execute a remote command, open remote shells, transfer files,
-forward ports, etc.
-
-The example below shows how to execute a remote command:
-
-@code
-int show_remote_processes(ssh_session session)
-{
- ssh_channel channel;
- int rc;
- char buffer[256];
- unsigned int nbytes;
-
- channel = ssh_channel_new(session);
- if (channel == NULL)
- return SSH_ERROR;
-
- rc = ssh_channel_open_session(channel);
- if (rc != SSH_OK)
- {
- ssh_channel_free(channel);
- return rc;
- }
-
- rc = ssh_channel_request_exec(channel, "ps aux");
- if (rc != SSH_OK)
- {
- ssh_channel_close(channel);
- ssh_channel_free(channel);
- return rc;
- }
-
- nbytes = ssh_channel_read(channel, buffer, sizeof(buffer), 0);
- while (nbytes > 0)
- {
- if (write(1, buffer, nbytes) != nbytes)
- {
- ssh_channel_close(channel);
- ssh_channel_free(channel);
- return SSH_ERROR;
- }
- nbytes = ssh_channel_read(channel, buffer, sizeof(buffer), 0);
- }
-
- if (nbytes < 0)
- {
- ssh_channel_close(channel);
- ssh_channel_free(channel);
- return SSH_ERROR;
- }
-
- ssh_channel_send_eof(channel);
- ssh_channel_close(channel);
- ssh_channel_free(channel);
-
- return SSH_OK;
-}
-@endcode
-
-@see @ref opening_shell
-@see @ref remote_command
-@see @ref sftp_subsystem
-@see @ref scp_subsystem
-
-
-@subsection errors Handling the errors
-
-All the libssh functions which return an error value also set an English error message
-describing the problem.
-
-Error values are typically SSH_ERROR for integer values, or NULL for pointers.
-
-The function ssh_get_error() returns a pointer to the static error message.
-
-ssh_error_code() returns the error code number : SSH_NO_ERROR,
-SSH_REQUEST_DENIED, SSH_INVALID_REQUEST, SSH_CONNECTION_LOST, SSH_FATAL,
-or SSH_INVALID_DATA. SSH_REQUEST_DENIED means the ssh server refused your
-request, but the situation is recoverable. The others mean something happened
-to the connection (some encryption problems, server problems, ...).
-SSH_INVALID_REQUEST means the library got some garbage from server, but
-might be recoverable. SSH_FATAL means the connection has an important
-problem and isn't probably recoverable.
-
-Most of time, the error returned are SSH_FATAL, but some functions
-(generaly the ssh_request_xxx ones) may fail because of server denying request.
-In these cases, SSH_REQUEST_DENIED is returned.
-
-ssh_get_error() and ssh_get_error_code() take a ssh_session as a parameter.
-That's for thread safety, error messages that can be attached to a session
-aren't static anymore. Any error that happens during ssh_options_xxx()
-or ssh_connect() (i.e., outside of any session) can be retrieved by
-giving NULL as argument.
-
-The SFTP subsystem has its own error codes, in addition to libssh ones.
-
-
-*/