Secure Shell (SSH) is a cryptographic network protocol for operating network services securely over an unsecured network. Typical applications include remote command-line login and remote command execution, but any network service can be secured with SSH.
Examples of services that can use SSH are [Git](../../dev/Git.md), [rsync](../cli/rsync.md) and X11 forwarding. Services that always use SSH are SCP and SFTP.
An SSH server, by default, listens on the standard [TCP](../../internet/TCP.md) port 22. An SSH client program is typically used for establishing connections to an sshd daemon accepting remote connections. Both are commonly present on most modern operating systems, including [macOS](../../macos/macOS.md), GNU/[Linux](../../linux/Linux.md), Solaris and OpenVMS. Proprietary, freeware and open source versions of various levels of complexity and completeness exist.
`sshd` is the OpenSSH server daemon, configured with `/etc/ssh/sshd_config` and managed by `sshd.service`. Whenever changing the configuration, use `sshd` in test mode before restarting the service to ensure it will be able to start cleanly. Valid configurations produce no output.
The `~/.ssh/authorized_keys` file is used to enable passwordless authentication using SSH keys. You can specify multiple allowed SSH keys one per line. The syntax is:
```
[options] key_type key [user@host]
```
Example:
```
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA7V4+1E...
```
Common Options:
-`command="command_to_run"`: Restricts the key to only execute a specific command. The SSH session will automatically execute this command upon login, and the user won't get an interactive shell.
-`from="hostname_or_ip_address"`: Limits the use of the key to a specific hostname or IP address, or a range of addresses.
-`no-port-forwarding`: Disables port forwarding for the key.
-`no-agent-forwarding`: Disables SSH agent forwarding for the key.
-`no-X11-forwarding`: Disables X11 forwarding for the key.
-`no-pty`: Disables the allocation of a pseudo-terminal for the key. This means the user won't get an interactive shell session.
-`permitopen="host:port"`: Restricts port forwarding to a specific host and port.
-`environment="VAR=value"`: Sets environment variables for the session when the key is used to log in.
Options are comma-seperated if you want to specify multiple.
#### `.ssh/rc`
The `~/.ssh/rc` file is a script that can be executed automatically whenever an SSH session is established. This can be configured globally with `/etc/ssh/sshrc`.