diff --git a/docs/06-advanced-techniques/31-the-secure-shell/diagrams/asymmetric-encryption.drawio b/docs/06-advanced-techniques/31-the-secure-shell/diagrams/asymmetric-encryption.drawio
new file mode 100644
index 00000000..d9cfe527
--- /dev/null
+++ b/docs/06-advanced-techniques/31-the-secure-shell/diagrams/asymmetric-encryption.drawio
@@ -0,0 +1 @@
+3VfbUtswEP2aPJKRrTikj+QC7RQGpulM26eOYiu2GtvryjKJ+fqubPmGk0A7gYHygnS02mjP2V1LAzqLdleSJcENeDwc2MTbDeh8YNuWRcb4TyN5iUzsSQn4UnjGqAGW4oEbkBg0Ex5PO4YKIFQi6YIuxDF3VQdjUsK2a7aGsPurCfN5D1i6LOyj34Sngiqu8Ydm4SMXfqCq+M7LhYhVxiaSNGAebFsQXQzoTAKochTtZjzU5FW8lPsuD6zWB5M8Vs/Z8EV+yleLW0c6V78p8ZQD/OeZieKehZkJ+E6Ke6b4wB6H6Ha6kjjy9egzz00gKq/YwZgSPYwBd9DpNhCKLxPmamyLCYFYoKIQZ5b2xdyNLyGLvdtMhSLmBveY3NziLqF0kpAhcRA0B+NS8d3BiK2aR0xADhFXEg9Jqg0jQ73JPWqNyvm2UXJiTIKWhhYxIDPJ49euG35xYCj+C7qdHoPcw3QzU5AqAB9iFi4adFoQxrVXgrPG5hogMQT+4krlpnZYpqBLO7Il8+9mfzH5UdDsVNP5rr04z82sPKs+4HH+MR7IpMuPxF1VLpM+V0fs6H49JQ+ZEvfdc5xcnHGvFpY89hBZxK7ME8X1+IanqW4Z+3S8Zivsfh3uWSj8GMcuUsYlAjqhBbaXC7MQCc8rZeapeGCrwp9mPwERqyJEZzpw5scqwvQ+s7npOG2lDqfjwfI5I0OLTGjp69kSGHd3+vitUqTdHbBep5gJjyWrD/HvKlo9FY18bfGwA2ADsEnd7Mi+7tatvCeaW6obWOx/LYqSNMA1X6suMgWlIOpiODtV07O7Tc+ummCr6dU27a43fqmmZ/cUweR3+yVUfUyyKLxwFbSrpaisO0iFEqCrZmUo7JWTgkeyQPmlmdXXA3IimsdOh2ZrD830NVmmPZbn/HDeZyuU4H9K+9HkraX9qCfIFFbvO+kd+40l/aTHcY/gFi1PEtv7WofaclpfW2cQaoXQLV0XfwfFSJWETf1isGuk5YGQCbksaqF6GJDiLpwGde1VyRHtfP26GgpIz4cCP/fpMAR3o+1Oc08edWSl1nlPVnvUl5W+lKzV46/9LDEd6/2/Shzyeq8SnDYPzPKG1TzT6eIP
\ No newline at end of file
diff --git a/docs/06-advanced-techniques/31-the-secure-shell/diagrams/symmetric-encryption.drawio b/docs/06-advanced-techniques/31-the-secure-shell/diagrams/symmetric-encryption.drawio
new file mode 100644
index 00000000..04fff38e
--- /dev/null
+++ b/docs/06-advanced-techniques/31-the-secure-shell/diagrams/symmetric-encryption.drawio
@@ -0,0 +1 @@
+7VbbbptAEP0aHhNxMa77GF+aVnLUqK7U5qlawxi2AoYsgzH5+u7CYthgW2nVRq3UJ3bOzA6zc+YsWN4iPdwKlsd3GEJiuXZ4sLyl5bqOY0/lQyF1i8zcWQtEgoc6qAc2/Ak0aGu05CEURiAhJsRzEwwwyyAgA2NCYGWG7TAx35qzCEbAJmDJGP3CQ4q7c03f9o73wKOYuvO9aR0p64L1SYqYhVgNIG9leQuBSO0qPSwgUc3r+tLue3fGeyxMQEYv2fBJfKi3q4++8G8fPTskH+Hbla9ro7o7MITy/NpEQTFGmLFk1aNzgWUWgspqS6uPWSPmEnQk+B2Iak0mKwklFFOaaK8sWNRf9f7GeFDGtd+Zy8PQuay11daqCjzbAg0VWIoALpy7GyUmIqALcd6RKDnhgCnIeuQ+AQkjvjfrYHrUomNcz4ZcaEJ+ghwtnT1LSv2mDWShRFZZIOqcQK3voCjUDJ/icc22Uo5G71nCo0yuA9kyEBLYgyAu5/1GO1Iehi3NUPAntm3yqe7nyDNqjujPLX955EMlgIN1Qox6cy+BIVPnx3Hcbp39yr527JnX5noxBTrdvSq/z+V45g7c7Qo5Cc8pOxbx6yw6IxY1fUPy7IrL60J1qCgqFIpYy50+lupymG8gEECO6/XQiG5TlFXMCTY5azRQyZvZHIJCengWfW70avfAGnZkInMkwtTEpOVfYn+kx7OEOt1g6I+DO9F2Nbhqu5h4cMtO7T8kOXdEltRFMFaXvMxztSzT5CYgHAqpEd09Fpw4KkFtdQtHSiN8RguWlPAMFsdPmf2b2jz1jTY7J9rsvWaXvVGXl/BfEo13MvvbJDEZkTXH7b8tCN99NUFIs//Faz8p/Y+yt/oB
\ No newline at end of file
diff --git a/docs/06-advanced-techniques/31-the-secure-shell/images/aws-congratulations.png b/docs/06-advanced-techniques/31-the-secure-shell/images/aws-congratulations.png
new file mode 100644
index 00000000..4d992d7e
Binary files /dev/null and b/docs/06-advanced-techniques/31-the-secure-shell/images/aws-congratulations.png differ
diff --git a/docs/06-advanced-techniques/31-the-secure-shell/images/aws-connect-to-instance.png b/docs/06-advanced-techniques/31-the-secure-shell/images/aws-connect-to-instance.png
new file mode 100644
index 00000000..9c8dd3ca
Binary files /dev/null and b/docs/06-advanced-techniques/31-the-secure-shell/images/aws-connect-to-instance.png differ
diff --git a/docs/06-advanced-techniques/31-the-secure-shell/images/aws-dashboard-keypairs.png b/docs/06-advanced-techniques/31-the-secure-shell/images/aws-dashboard-keypairs.png
new file mode 100644
index 00000000..14680647
Binary files /dev/null and b/docs/06-advanced-techniques/31-the-secure-shell/images/aws-dashboard-keypairs.png differ
diff --git a/docs/06-advanced-techniques/31-the-secure-shell/images/aws-import-key-pair-details.png b/docs/06-advanced-techniques/31-the-secure-shell/images/aws-import-key-pair-details.png
new file mode 100644
index 00000000..33f80b7f
Binary files /dev/null and b/docs/06-advanced-techniques/31-the-secure-shell/images/aws-import-key-pair-details.png differ
diff --git a/docs/06-advanced-techniques/31-the-secure-shell/images/aws-import-key-pair.png b/docs/06-advanced-techniques/31-the-secure-shell/images/aws-import-key-pair.png
new file mode 100644
index 00000000..ab7a75fd
Binary files /dev/null and b/docs/06-advanced-techniques/31-the-secure-shell/images/aws-import-key-pair.png differ
diff --git a/docs/06-advanced-techniques/31-the-secure-shell/images/aws-instance-ssh-details.png b/docs/06-advanced-techniques/31-the-secure-shell/images/aws-instance-ssh-details.png
new file mode 100644
index 00000000..06aa47f9
Binary files /dev/null and b/docs/06-advanced-techniques/31-the-secure-shell/images/aws-instance-ssh-details.png differ
diff --git a/docs/06-advanced-techniques/31-the-secure-shell/images/aws-launch-instance.png b/docs/06-advanced-techniques/31-the-secure-shell/images/aws-launch-instance.png
new file mode 100644
index 00000000..831066a0
Binary files /dev/null and b/docs/06-advanced-techniques/31-the-secure-shell/images/aws-launch-instance.png differ
diff --git a/docs/06-advanced-techniques/31-the-secure-shell/images/aws-select-instance.png b/docs/06-advanced-techniques/31-the-secure-shell/images/aws-select-instance.png
new file mode 100644
index 00000000..11cb389d
Binary files /dev/null and b/docs/06-advanced-techniques/31-the-secure-shell/images/aws-select-instance.png differ
diff --git a/docs/06-advanced-techniques/31-the-secure-shell/images/aws-select-key-pair.png b/docs/06-advanced-techniques/31-the-secure-shell/images/aws-select-key-pair.png
new file mode 100644
index 00000000..9e1ec67a
Binary files /dev/null and b/docs/06-advanced-techniques/31-the-secure-shell/images/aws-select-key-pair.png differ
diff --git a/docs/06-advanced-techniques/31-the-secure-shell/images/create-free-account.png b/docs/06-advanced-techniques/31-the-secure-shell/images/create-free-account.png
new file mode 100644
index 00000000..c7eecdbb
Binary files /dev/null and b/docs/06-advanced-techniques/31-the-secure-shell/images/create-free-account.png differ
diff --git a/docs/06-advanced-techniques/31-the-secure-shell/index.mdx b/docs/06-advanced-techniques/31-the-secure-shell/index.mdx
new file mode 100644
index 00000000..54cd6379
--- /dev/null
+++ b/docs/06-advanced-techniques/31-the-secure-shell/index.mdx
@@ -0,0 +1,324 @@
+---
+title: 'The Secure Shell'
+slug: '/part-6-advanced-techniques/the-secure-shell/'
+chapterNumber: 33
+---
+
+So far we have been using the shell to operate on our local machine. We can use _Secure Shell Protocol_, or _SSH_, to open a secure network connection to a remote machine and use the shell to work on that machine.
+
+In this chapter we'll look at how to setup the required credentials and keys to allow us to securely connect to a remote machine, how to create a virtual machine in the cloud and then how to connect to that machine from our local machine using the `ssh` program. We'll also look at how to configure `ssh` to make it even faster to work with!
+
+## What is SSH?
+
+SSH is the _Secure Shell Protocol_. It is a protocol that has been used for decades as a way to establish a secure network to a remote machine, on your network or across the internet. The _program_ named `ssh` is the 'secure shell' - it is a program that helps you establish SSH connections, manage credentials, and open a shell on a remote machine.
+
+When we use the secure shell, we use _asymmetric encryption_ to secure the communication between our machine and the target machine. Asymmetric encryption uses special 'keys', called 'public keys' and 'private keys' to manage authentication and secure data. This might be new to you if you are used to using simple authentication protocols such as username and password. But public/private key based security is _extremely_ secure and a great thing to know about! So let's start by looking at how public and private keys work and then create our own key pair which we will later use to secure our connections.
+
+## Public and Private Keys
+
+Asymmetric encryption is a complex subject, the low-level details are beyond the scope of this book[^1]. But we can certainly cover the basics!
+
+Before we look at asymmetric encryption, let's take a quick look at the challenges of symmetric encryption - which will help explain _why_ asymmetric encryption is preferred.
+
+### Symmetric Encryption
+
+When we use symmetric encryption, we have a shared 'secret', normally something like a username and password. If a user 'Alice' wants to send a message to another user, 'Bob', we have to share the secret so that Bob can decrypt the message that Alice sends:
+
+import Drawio from '@theme/Drawio'
+import symmetricEncryption from '!!raw-loader!./diagrams/symmetric-encryption.drawio';
+
+
+
+The diagram above is a hugely simplified view, but essentially shows that when the users want to exchange a message they _both_ need to know the secret that is used to encrypt it.
+
+Now in reality there are ways to obscure and protect this secret somewhat, but no matter how many clever tricks are used, we are still in the situation where the recipient has sensitive data - the user's secret. This is actually quite problematic because it means if we don't trust this user, or their machine or environment, we might not want to share a secret.
+
+### Asymmetric Encryption
+
+We we use asymmetric encryption, Alice first creates a 'keypair'. This is two files - a public key and a private key. Alice keeps the private key. She uses this to encrypt the message. Bob receives the public key - he can use this to decrypt the message:
+
+import asymmetricEncryption from '!!raw-loader!./diagrams/asymmetric-encryption.drawio';
+
+
+
+The fantastic thing about this mechanism is that _only Alice can encrypt messages_ - Bob can decrypt and read the messages, but cannot encrypt them on behalf of Alice. So Alice can keep her key safe. Her public key is not sensitive - it can only be used to verify that a message has come from Alice, decrypt the message and ensure the message has not been tampered with.
+
+Almost all modern day encryption is built on this mechanism - when you open a secure connection to a website, an exchange of keys is made between you and the server[^2].
+
+When we use the secure shell to communicate with a remote machine, we will give the remote machine our _public key_, and we will encrypt our communications with the _private key_. This is essential because _other users_ might have access to the remote machine - we don't want them seeing our sensitive data such as passwords or private keys.
+
+Let's look at how to create a keypair now.
+
+## Creating a Keypair
+
+We can use the `ssh-keygen` (_OpenSSH authentication key utility_) to create a keypair. We are going to use this keypair to communicate with a server we will create on Amazon Web Services or AWS. AWS requires that we use a particular format known as _PEM_, so let's create a keypair in that format now. We will move to the _~/.ssh_ folder first, which is where users often store their SSH keys:
+
+```bash
+cd ~/.ssh
+ssh-keygen -m PEM
+```
+
+When you run this command, it will ask you where you would like to save the file:
+
+```
+Generating public/private rsa key pair.
+Enter file in which to save the key (/home/dwmkerr/.ssh/id_rsa):
+```
+
+I suggest that you use the default location which is the _~/.ssh_ folder, but name the key pair 'effective-shell':
+
+```
+Enter passphrase (empty for no passphrase):
+```
+
+At this point you will be asked to provide an optional passphrase. We will leave this blank as we are not going to use the server or key for any particularly sensitive data. However, if you are creating keys that will encrypt sensitive data you should definitely add a passphrase. If you add a passphrase, you'll be required to enter each each time you load the key. This adds a layer of security - if someone steals your private key they would have to know the passphrase to open it.
+
+Once you have skipped the passphrase and passphrase confirmation by pressing the enter key twice, you'll see the final output:
+
+```
+Your identification has been saved in effective-shell
+Your public key has been saved in effective-shell.pub
+The key fingerprint is:
+SHA256:HcqIl3ZhRz9jvhYO3g64FEYT3mAoDc6P4mnh4aKuY08 dwmkerr@macbook
+The key's randomart image is:
++---[RSA 3072]----+
+| .o .+ . |
+| o. oo = . |
+| o. * + = |
+| + * * + o |
+| + o * S o o |
+| + = o o + + o |
+|. *E o o = |
+|o+. . . + |
+|*o.. . . |
++----[SHA256]-----+
+```
+
+The randomart shown is designed to provide a more user-friendly way to identify a key - if you have many keys you can see the randomart for each to pick the one you want. I have not yet met anyone who remembers their randomart so I think it's safe for you to ignore it for now!
+
+The essential thing is that we now have two new files - our public and private keys:
+
+```
+$ ls | grep effective
+effective-shell
+effective-shell.pub
+```
+
+The public key is the key with `.pub` at the end.
+
+Now let's create a new virtual machine in the cloud and provide it with our public key so that we can access it. To do this, we're going to set up a virtual machine on the AWS Free Tier - which means it shouldn't cost us anything to run.
+
+## Setting up an AWS Account
+
+We're going to create a virtual machine in the cloud to connect to and test out `ssh`. We'll do this using Amazon Web Services, which is probably the most popular cloud services provider. If you already have an account you can skip this part of the chapter.
+
+To sign up for an AWS account, open the site at:
+
+https://aws.amazon.com/account/sign-up
+
+Choose the 'Create Free Account' option:
+
+
+
+When you sign up you will be asked to provide quite a few details, as well as credit card details. Make sure you select the "Basic Support Plan", which is free.
+
+:::caution Avoiding Credit Card Bills
+
+Amazon require your credit card details in case you access services that have costs associated with them. In this chapter we will be using 'free tier' services that have no costs, but be very careful if experimenting or playing with services on AWS - most of them are paid.
+
+The costs are generally low and there are safeguards in place to ensure you don't accidentally create expensive resources, but keep your AWS credentials _very_ safe. If someone has access to them they could run expensive services on your account.
+
+:::
+
+Once you have signed up successfully, you will see the 'congratulations' message. You can now press the button to go to the management console.
+
+
+
+You will be asked for your password again.
+
+Congratulations - you now have an AWS account that you can use to run services in the cloud! Now let's create a virtual machine that we can connect to.
+
+## Creating a Virtual Machine on AWS
+
+Use the search bar in the AWS Management Console to search for 'EC2'. EC2 is the name AWS uses for it's virtual machine services.
+
+The first thing we are going to do is upload our public key to AWS so that it can be used when we create our virtual machine. Select the 'Key Pairs' option from the menu on the left or the dashboard:
+
+
+
+When the key pairs view is open, choose 'Actions > Import Key Pair':
+
+
+
+Give the key pair a sensible name and upload the _public_ key file, which will be in _~/.ssh/effective-shell.pub_ if you have been following with the tutorial. Alternatively you can open that file on your local machine and copy its contents:
+
+
+
+
+Now that the key pair has been imported we can go back to the EC2 dashboard and choose 'Launch Instance':
+
+
+
+We are now going to go through a set of options to specify the details of the virtual machine AWS will create for us. I'm not going to cover all of the options, we're going to be creating a simple virtual machine with essentially what is the default configuration.
+
+**Step 1: Choose an Amazon Machine Image (AMI)**
+
+The first option should be _Amazon Linux 2 AMI (HVM) - Kernel 5.10, SSD Volume Type_, with a 'Free Tier Eligible' label on the left. Press the blue 'Select' button on the right of this machine to choose this instance type.
+
+**Step 2: Choose an Instance Type**
+
+Select the default _t2.micro_ instance type. This is free-tier eligible and more than powerful enough for our needs.
+
+Now press 'Review and Launch' - we do not need to configure any of the advanced options.
+
+**Step 7: Review Instance Launch**
+
+There will be a warning saying that 'your security group is open to the world' on this page. We can safely ignore that as we are not putting anything sensitive on this instance. This message is telling us that _anyone_ who knows the address of our instance can try and connect to it.
+
+This is not a problem for what we are doing, as we are creating this machine to experiment with and not putting sensitive data on it.
+
+Press the 'Launch' button on the bottom right - another screen will pop up, don't dismiss this screen, it is where we will choose our key pair!
+
+**Select Key Pair**
+
+We will be asked to provide a key pair. Make sure the key pair you just imported is selected!
+
+
+
+You will be required to select the check box that says "I acknowledge that I have access to the private key" - this is AWS warning us that if we don't have the private key associated with the public key we uploaded, we will not be able to connect to the instance.
+
+Once you have checked the checkbox, you can choose "Launch Instances".
+
+Launching the instance will take a few seconds. Press the "View Instances" button when this is done.
+
+Select the checkbox next to this new instance:
+
+
+
+Once you have selected the instance, press the 'Connect' button. In the screen that pops up, choose 'SSH Client':
+
+
+
+Keep this browser window open, it contains the details we need to know for the next steps.
+
+:::danger Shut down your Virtual Machine when you are done with it!
+
+When you have finished experimenting with your virtual machine, you should power it down. You can select it in the AWS Console and choose the 'Instance State > Stop Instance' option. When you are completely finished with the instance, choose 'Instance State > Terminate'. You should not be billed for this instance as it is in the free tier, but better safe than sorry!
+
+:::
+
+## Using SSH to connect to a virtual machine
+
+Now that we have created a virtual machine, we can use the `ssh` program to open a connection to it and run a secure shell.
+
+When we want to SSH onto a machine, we need to provide a few details:
+
+1. The address of the machine, which is its _hostname_
+2. The username for the user we are going to connect with
+3. Credentials for the user we are going to connect with
+
+The address of the machine we have created will be shown in the 'Connect to instance' page we should still have open from the AWS dashboard:
+
+
+
+AWS is giving us some hints here about how to connect, it is even showing the specific command we will run with `ssh`.
+
+From our own shell we will now run the `ssh` command to connect to our instance. To connect, using the details for my new virtual machine, I would run this command:
+
+```bash
+ssh -i ~/.ssh/effective-shell \
+ ec2-user@ec2-13-213-71-135.ap-southeast-1.compute.amazonaws.com
+```
+
+You can see that we have provided three pieces of information:
+
+- The credentials, by using the `-i` (_identity file_) flag, providing our _private key_ file
+- The username, which is the `ec2-user` part of the command, coming before the ampersand
+- The hostname, which is the address that follows the ampersand
+
+When I run this command a warning is shown telling me that
+
+```
+The authenticity of host 'ec2-13-213-71-135.ap-southeast-1.compute.amazonaws.com (13.213.71.135)' can't be established.
+ED25519 key fingerprint is SHA256:8wq6Xu4xEk/BO3diae+BWUFTTKunzvCz4XidFYpl6F8.
+This key is not known by any other names
+Are you sure you want to continue connecting (yes/no/[fingerprint])?
+```
+
+This is my SSH client telling me that I haven't connected to this machine before so it cannot be sure that this machine is one I want to connect to. Once I continue, by entering `yes` and pressing enter, my SSH client will record the IP address of this machine, as well as it's hostname, meaning that in the future when I connect it will recognise it. If the IP address _changes_ my SSH client will warn me - this is a useful security feature to protect against someone 'swapping' the machine you are connecting to for another one!
+
+After typing `yes` and pressing enter to continue connecting, I will see Bash running in my AWS Linux virtual machine!
+
+```
+Warning: Permanently added 'ec2-13-213-71-135.ap-southeast-1.compute.amazonaws.com' (ED25519) to the list of known hosts.
+
+ __| __|_ )
+ _| ( / Amazon Linux 2 AMI
+ ___|\___|___|
+
+https://aws.amazon.com/amazon-linux-2/
+[ec2-user@ip-172-31-23-196 ~]$
+```
+
+I have a welcome message from AWS and are running a shell on my virtual machine, via the `ssh` program from my local machine!
+
+We can see the current shell being used by checking the `SHELL` variable:
+
+```
+[ec2-user@ip-172-31-23-196 ~]$ echo $SHELL
+/bin/bash
+```
+
+When I want to disconnect, I can just run the `exit` command to close the connection to the virtual machine.
+
+Hopefully if you have followed this far, you also have access to a virtual machine to play with. Now let's look at some of the things we can do with the SSH to make accessing these machines even easier!
+
+## Configuring SSH Hosts
+
+It can be difficult to remember the details such as the host name, location of the key and username of your virtual machines. One thing you can do to make it far easier to connect is to create an entry in your _SSH Config_ file that stores this information. This will let you connect much more quickly.
+
+To create an entry for my virtual machine, I would add the following text to the _~/.ssh/cnfig_ file:
+
+``` title="~/.ssh/config"
+Host effective-shell-aws-linux
+ HostName ec2-13-213-71-135.ap-southeast-1.compute.amazonaws.com
+ User ec2-user
+ IdentityFile "~/.ssh/effective-shell.pem"
+```
+
+The first part of this configuration is the host 'alias' - how you will refer to the host when you want to connect to it. It can be convenient to give this a short but descriptive name. After this, we have a set of settings, each indented by a tab or two spaces, the settings we have are:
+
+- `HostName` the full address of the host
+- `User` the name of the user to connect as
+- `IdentityFile` the path to the private key file used to connect
+
+Now if I want to connect to the virtual machine, all I need to do is run the following command:
+
+```bash
+ssh effective-shell-aws-linux
+```
+
+In fact the `ssh` program supports shell completion, meaning I can just type `ssh` and a few letters of the host then the tab key - the shell will suggest the hosts from my config, so I don't even need to remember the name I set for it:
+
+```
+ssh e # when I press tab, the shell expands this to:
+ssh effective-shell-aws-linux
+```
+
+There are many other options available for the SSH config file, you can see them all with `man ssh_config`. We'll see some other options in [Chapter 33 - Master the Multiplexer](../33-master-the-multiplexer/index.md).
+
+## Handling Disconnections
+
+One thing that will soon become a pain if you are regularly SSH-ing into virtual machines is disconnections. This can occur when you lose network connectivity. You might not even notice that a disconnection has occurred - I find it is more common that the `ssh` session is simply frozen and not responding to any input at all.
+
+It is annoying when this happens - often the shell is so unresponsive that you cannot even free it by pressing `^D` or `^C`. There is actually an escape character that you can use to end a broken session, which is the `Enter` key, followed by `~` and then `.`. This is not particularly easy to remember.
+
+In [Chapter 33 - Master the Multiplexer](../33-master-the-multiplexer/index.md) we'll look at some great ways to improve upon this, for now if you forget the Enter/Tidle/Dot escape sequence the easiest thing to do is to close your terminal program.
+
+When you disconnect from your SSH session, the commands you are running will be terminated. This is because your shell will send the 'hang up' signal. Again, this can be frustrating if you actually want to keep something running on the server. We'll also look at how to work around this behaviour in Chapter 33.
+
+## Summary
+
+In this chapter we discussed the SSH protocol, and how keys are used to protect connections to remote servers. We saw how to setup an AWS account, create a virtual machine with a given public key, connect to it with the `ssh` program, and configure SSH with an alias to make future connections faster. We also saw some of the challenges we can face with network connectivity - which we'll see techniques to handle in Chapter 33.
+
+[^1]: This process is very useful to know about, it is called Diffie–Hellman key exchange. There are many great articles online that explain it in detail.
diff --git a/docs/06-advanced-techniques/33-master-the-multiplexer/index.md b/docs/06-advanced-techniques/33-master-the-multiplexer/index.md
index f3fc1365..76473da1 100644
--- a/docs/06-advanced-techniques/33-master-the-multiplexer/index.md
+++ b/docs/06-advanced-techniques/33-master-the-multiplexer/index.md
@@ -349,6 +349,7 @@ A quick reference of command commands below:
| Command | Description |
|-------------------------------|------------------------------------------------------------------------------------|
+| **Essential Tmux Commands** | |
| `tmux ls` | List sessions |
| `tmux new [-s name]` | Start a new `tmux` (optionally with a session name) |
| `tmux attach [-t name]` | Attach to the last used session, or the target session with `-t` |
@@ -357,13 +358,13 @@ A quick reference of command commands below:
| `^b d` | Detach from the current session |
| `^b : new -s another-name` | Enter command mode, start session named `another-name` |
| `^b ?` | Show command help |
-|-------------------------------|------------------------------------------------------------------------------------|
+| **Sessions* | |
| `^b $` | Rename the current session |
| `^b s` | Show the session list. Close the selected session with `x` |
| `^b )` | Move to next session |
| `^b (` | Move to the previous session |
| `^b w` | Show all windows - this command also shows all sessions! |
-|-------------------------------|------------------------------------------------------------------------------------|
+| **Windows** | |
| `^b n` | Move to the next window |
| `^b p` | Move to the previous window |
| `^b 0` | Select the window numbered '0' - use the number of any window from the status pane |
@@ -371,7 +372,7 @@ A quick reference of command commands below:
| `^b ,` | Rename the current window |
| `^b w` | Show the window navigator |
| `^b $` | Kill the current window |
-|-------------------------------|------------------------------------------------------------------------------------|
+| **Splits and Panes** | | |
| `^b %` | Create a horizontal split |
| `^b "` | Create a vertical split |
| `^b ` | Move to the pane in the direction of an arrow key |
@@ -383,3 +384,12 @@ A quick reference of command commands below:
In this chapter we introduced the concept of Terminal Multiplexers, in particular GNU screen and Tmux. We saw how to manage windows, panes and sessions. We learned how to configure Tmux to suit your personal working style. We also looked at how we can use Tmux to manage sessions on remote machines and even collaborate real time with other users.
[^1]: You can find my complete set of dotfiles at [github.com/dwmkerr/dofiles](https://github.com/dwmkerr/dotfiles) if you would like to see how I configure other programs.
+
+## TODO
+
+```
+RequestTTY yes
+RemoteCommand screen -UDr
+```
+
+TODO update tmux info, so that we always open tmux in our ssh client
diff --git a/docs/xx-appendices/reading-list.md b/docs/xx-appendices/reading-list.md
index 37e6b2e1..10c59dd9 100644
--- a/docs/xx-appendices/reading-list.md
+++ b/docs/xx-appendices/reading-list.md
@@ -52,6 +52,12 @@ Absolutely the best book I've read on Vim, perfect for users of all levels. Writ
This is a wonderful repository, which aims to help you "Master the command line, in one page". This page is full of useful resources and is a superb reference for users from novice all the way to advanced!
+### Security
+
+**Applied Cryptography: Protocols, Algorithms, and Source Code in C - Bruce Schneier**
+
+This is the absolute best book around on cryptography - from concepts, protocols all the way to advanced topics. There are code examples in C that allow you to really see how these concepts work in practice. This is an excellent book for someone who wants to learn about cryptography but also have the option to go deep into the topics that interest them.
+
## Great Videos
### The UNIX Operating System
diff --git a/docs/xx-appendices/setting-up-a-linux-virtual-machine.md b/docs/xx-appendices/setting-up-a-linux-virtual-machine.md
deleted file mode 100644
index 3c996392..00000000
--- a/docs/xx-appendices/setting-up-a-linux-virtual-machine.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# Setting up a Linux Virtual Machine
-
-Todo: how to set up any of the three main distros (Debian, SUSE, Centos)
-
-Note different:
-
-- Package managers
-- Startup Managers
-- Desktop Managers
diff --git a/docusaurus.config.js b/docusaurus.config.js
index 4bc42911..66258c8c 100644
--- a/docusaurus.config.js
+++ b/docusaurus.config.js
@@ -130,6 +130,10 @@ const config = {
indexBlog: false, // we are not using the blog features.
},
],
+ [
+ require.resolve('docusaurus-plugin-drawio'),
+ {}
+ ],
],
};
diff --git a/package-lock.json b/package-lock.json
index eced60ab..8a7bdbe4 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -4022,6 +4022,14 @@
"buffer-indexof": "^1.0.0"
}
},
+ "docusaurus-plugin-drawio": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/docusaurus-plugin-drawio/-/docusaurus-plugin-drawio-0.1.7.tgz",
+ "integrity": "sha512-0aq9/1yU+NmZ0gzRnsXEwWnc7c4jhos4AXuGxd3GIXNSCdgZuJkFnZn1tBfJ+a4WrL6PTdN71y2A3AGuVQ8wfA==",
+ "requires": {
+ "raw-loader": "^4.0.2"
+ }
+ },
"dom-converter": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz",
@@ -6920,6 +6928,15 @@
}
}
},
+ "raw-loader": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz",
+ "integrity": "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==",
+ "requires": {
+ "loader-utils": "^2.0.0",
+ "schema-utils": "^3.0.0"
+ }
+ },
"rc": {
"version": "1.2.8",
"resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
diff --git a/package.json b/package.json
index eeb7321b..6fd21857 100644
--- a/package.json
+++ b/package.json
@@ -24,6 +24,7 @@
"@types/react": "^17.0.43",
"asciinema-player": "^3.0.0-rc.1",
"clsx": "^1.1.1",
+ "docusaurus-plugin-drawio": "^0.1.7",
"prism-react-renderer": "^1.2.1",
"react": "^17.0.1",
"react-dom": "^17.0.1",
diff --git a/sidebars.js b/sidebars.js
index a6ddf751..f68747d4 100644
--- a/sidebars.js
+++ b/sidebars.js
@@ -81,6 +81,7 @@ const sidebars = {
items: [
'advanced-techniques/understanding-shell-expansion/index',
'advanced-techniques/how-to-avoid-scripting/index',
+ 'advanced-techniques/the-secure-shell/index',
'advanced-techniques/master-the-multiplexer/index',
]
},