One essential tool to master as a system administrator is SSH.
SSH, or Secure Shell, is a protocol used to securely log onto remote systems. It is the most common way to access remote Linux servers.
In this guide, we will discuss how to use SSH to connect to a remote system.
Deploy your frontend applications from GitHub using DigitalOcean App Platform. Let DigitalOcean focus on scaling your app.
To connect to a remote system using SSH, we’ll use the ssh
command.
If you are using Windows, you’ll need to install a version of OpenSSH in order to be able to ssh
from a terminal. If you prefer to work in PowerShell, you can follow Microsoft’s documentation to add OpenSSH to PowerShell. If you would rather have a full Linux environment available, you can set up WSL, the Windows Subsystem for Linux, which will include ssh
by default. Finally, as a lightweight third option, you can install Git for Windows, which provides a native Windows bash terminal environment that includes the ssh
command. Each of these are well-supported and whichever you decide to use will come down to preference.
If you are using a Mac or Linux, you will already have the ssh
command available in your terminal.
The most straightforward form of the command is:
- ssh remote_host
The remote_host
in this example is the IP address or domain name that you are trying to connect to.
This command assumes that your username on the remote system is the same as your username on your local system.
If your username is different on the remote system, you can specify it by using this syntax:
- ssh remote_username@remote_host
Once you have connected to the server, you may be asked to verify your identity by providing a password. Later, we will cover how to generate keys to use instead of passwords.
To exit the ssh session and return back into your local shell session, type:
- exit
SSH works by connecting a client program to an ssh server, called sshd
.
In the previous section, ssh
was the client program. The ssh server was already running on the remote_host
that we specified.
On nearly all Linux environments, the sshd
server should start automatically. If it is not running for any reason, you may need to temporarily access your server through a web-based console, or local serial console.
The process needed to start an ssh server depends on the distribution of Linux that you are using.
On Ubuntu, you can start the ssh server by typing:
- sudo systemctl start ssh
That should start the sshd server and you can then log in remotely.
When you change the configuration of SSH, you are changing the settings of the sshd server.
In Ubuntu, the main sshd configuration file is located at /etc/ssh/sshd_config
.
Back up the current version of this file before editing:
- sudo cp /etc/ssh/sshd_config{,.bak}
Open it using nano
or your favourite text editor:
- sudo nano /etc/ssh/sshd_config
You will want to leave most of the options in this file alone. However, there are a few you may want to take a look at:
Port 22
The port declaration specifies which port the sshd server will listen on for connections. By default, this is 22
. You should probably leave this setting alone, unless you have specific reasons to do otherwise. If you do change your port, we will show you how to connect to the new port later on.
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
The host keys declarations specify where to look for global host keys. We will discuss what a host key is later.
SyslogFacility AUTH
LogLevel INFO
These two items indicate the level of logging that should occur.
If you are having difficulties with SSH, increasing the amount of logging may be a good way to discover what the issue is.
LoginGraceTime 120
PermitRootLogin yes
StrictModes yes
These parameters specify some of the login information.
LoginGraceTime
specifies how many seconds to keep the connection alive without successfully logging in.
It may be a good idea to set this time just a little bit higher than the amount of time it takes you to log in normally.
PermitRootLogin
selects whether the root user is allowed to log in.
In most cases, this should be changed to no
when you have created a user account that has access to elevated privileges (through su
or sudo
) and can log in through ssh, in order to minimize the risk of anyone gaining root access to your server.
strictModes
is a safety guard that will refuse a login attempt if the authentication files are readable by everyone.
This prevents login attempts when the configuration files are not secure.
X11Forwarding yes
X11DisplayOffset 10
These parameters configure an ability called X11 Forwarding. This allows you to view a remote system’s graphical user interface (GUI) on the local system.
This option must be enabled on the server and given with the SSH client during connection with the -X
option.
After making your changes, save and close the file. If you are using nano
, press Ctrl+X
, then when prompted, Y
and then Enter.
If you changed any settings in /etc/ssh/sshd_config
, make sure you reload your sshd server to implement your modifications:
- sudo systemctl reload ssh
You should thoroughly test your changes to ensure that they operate in the way you expect.
It may be a good idea to have a few terminal sessions open while you are making changes. This will allow you to revert the configuration if necessary without locking yourself out.
While it is helpful to be able to log in to a remote system using passwords, it is faster and more secure to set up key-based authentication.
Key-based authentication works by creating a pair of keys: a private key and a public key.
The private key is located on the client machine and is secured and kept secret.
The public key can be given to anyone or placed on any server you wish to access.
When you attempt to connect using a key-pair, the server will use the public key to create a message for the client computer that can only be read with the private key.
The client computer then sends the appropriate response back to the server and the server will know that the client is legitimate.
This process is performed automatically after you configure your keys.
SSH keys should be generated on the computer you wish to log in from. This is usually your local machine.
Enter the following into the command line:
- ssh-keygen -t rsa
You may be prompted to set a password on the key files themselves, but this is a fairly uncommon practice, and you should press enter through the prompts to accept the defaults. Your keys will be created at ~/.ssh/id_rsa.pub and ~/.ssh/id_rsa.
Change into the .ssh
directory by typing:
- cd ~/.ssh
Look at the permissions of the files:
- ls -l
Output-rw-r--r-- 1 demo demo 807 Sep 9 22:15 authorized_keys
-rw------- 1 demo demo 1679 Sep 9 23:13 id_rsa
-rw-r--r-- 1 demo demo 396 Sep 9 23:13 id_rsa.pub
As you can see, the id_rsa
file is readable and writable only to the owner. This helps to keep it secret.
The id_rsa.pub
file, however, can be shared and has permissions appropriate for this activity.
If you currently have password-based access to a server, you can copy your public key to it by issuing this command:
- ssh-copy-id remote_host
This will start an SSH session. After you enter your password, it will copy your public key to the server’s authorized keys file, which will allow you to log in without the password next time.
There are a number of optional flags that you can provide when connecting through SSH.
Some of these may be necessary to match the settings in the remote host’s sshd
configuration.
For instance, if you changed the port number in your sshd
configuration, you will need to match that port on the client-side by typing:
- ssh -p port_number remote_host
Note: Changing your ssh port is a reasonable way of providing security through obscurity. If you are allowing ssh connections to a widely known server deployment on port 22 as normal, and you have password authentication enabled, you will likely be attacked by many automated login attempts. Exclusively using key-based authentication and running ssh on a nonstandard port is not the most complex security solution you can employ, but should reduce these to a minimum.
If you only want to execute a single command on a remote system, you can specify it after the host like so:
- ssh remote_host command_to_run
You will connect to the remote machine, authenticate, and the command will be executed.
As we said before, if X11 forwarding is enabled on both computers, you can access that functionality by typing:
- ssh -X remote_host
Providing you have the appropriate tools on your computer, GUI programs that you use on the remote system will now open their window on your local system.
If you have created SSH keys, you can enhance your server’s security by disabling password-only authentication. Apart from the console, the only way to log into your server will be through the private key that pairs with the public key you have installed on the server.
Warning: Before you proceed with this step, be sure you have installed a public key to your server. Otherwise, you will be locked out!
As root or user with sudo privileges, open the sshd
configuration file:
- sudo nano /etc/ssh/sshd_config
Locate the line that reads Password Authentication
, and uncomment it by removing the leading #
. You can then change its value to no
:
PasswordAuthentication no
Two more settings that should not need to be modified (provided you have not modified this file before) are PubkeyAuthentication
and ChallengeResponseAuthentication
. They are set by default, and should read as follows:
PubkeyAuthentication yes
ChallengeResponseAuthentication no
After making your changes, save and close the file.
You can now reload the SSH daemon:
- sudo systemctl reload ssh
Password authentication should now be disabled, and your server should be accessible only through SSH key authentication.
Learning your way around SSH will greatly benefit any of your future cloud computing endeavours. As you use the various options, you will discover more advanced functionality that can make your life easier. SSH has remained popular because it is secure, light-weight, and useful in diverse situations.
Next, you may want to learn about working with SFTP to perform command line file transfers.
We’ve made it super easy to add SSH Keys to your new or existing DigitalOcean virtual machines.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!
Hi Justin!
Greetings from Argentina!
Awesome article about SSH Server configuration file.
As in your own words: “The host keys declarations specify where to look for global host keys. We will discuss what a host key is later.”
Did you discuss about host keys in other Digital Ocean article?
Have a wonderful day!
fernando
can we use write command to a user who is connect to us using ssh connection?
On cPanel based server you can connect it easily.
Follow this video: https://www.youtube.com/watch?v=9Yx1gZKgb5Y
Hi, Thanks, extremely clear guidance. The local system is Cygwin on a WIndows 7 PC, The remote system is Ubuntu.
I still have a problem : “we sent a publickey packet” - but there is no reply :
debug1: SSH2_MSG_SERVICE_REQUEST sent debug2: service_accept: ssh-userauth debug1: SSH2_MSG_SERVICE_ACCEPT received debug2: key: /home/jbww/.ssh/id_rsa (0x80061bd0), debug2: key: /home/jbww/.ssh/id_dsa (0x0), debug2: key: /home/jbww/.ssh/id_ecdsa (0x0), debug1: Authentications that can continue: publickey,password debug1: Next authentication method: publickey debug1: Offering RSA public key: /home/jbww/.ssh/id_rsa debug2: we sent a publickey packet, wait for reply debug1: Authentications that can continue: publickey,password debug1: Trying private key: /home/jbww/.ssh/id_dsa debug1: Trying private key: /home/jbww/.ssh/id_ecdsa debug2: we did not send a packet, disable method debug1: Next authentication method: password
Does anyone have an idea as to what I can try ?
Hey thanks. It’s very helpful tutorial.
I have query regarding to see the server console for the running processes. So, can you please suggest me the command to see the running server console, so that i will be able to see the errors if occurs?
Hey thanks. It’s the clearest tutorial I found! and your blog looks nice.
I guess you forgot to mention you can disable password authentication after setting up SSH keys, as not to be exposed to brute force attacks.
my login isn’t working for the console… any tips?
@forgotmyorange: If you connect with <code>ssh -vv root@your.ip.address</code> it will add debugging output so that you can see what is happening behind the scenes. If it is actually connecting with the key, you should see something like:
<pre> debug1: Authentications that can continue: publickey,password debug1: Next authentication method: publickey debug1: Offering RSA public key: /home/asb/.ssh/id_rsa debug2: we sent a publickey packet, wait for reply debug1: Server accepts key: pkalg ssh-rsa blen 279 </pre>
I did exactly as instructed and it all seemed to work but it changed nothing in regards to having to type in a password. I still have to type one in. Did you miss stating the obvious, like that we still have to make config changes on the server or something?
Thank you very much, Mr. Justin. I can install whmsonic from ubuntu from your article.