# SSH Setup for taskqueue

## Overview

If you separate your daily working machine from a remote high performance cluster (HPC), the `taskqueue` package can connect to the remote server using the R `ssh` library to run tasks remotely.

For example, your daily working machine is `daily-work` and the remote HPC head/login node is `hpc-login`. You can submit and run tasks on `hpc-login` from `daily-work` via an SSH connection.

To run tasks on a remote server, you must enable passwordless SSH login from `daily-work` to the remote server.

## Prerequisites

- SSH client installed on your local machine (`daily-work`)
- SSH server running on the remote HPC (`hpc-login`)
- User account on the remote server
- R package `ssh` installed: `install.packages("ssh")`

## Setup Steps

### 1. Generate SSH keypair

Generate a new SSH key pair on your local machine (`daily-work`):

    ssh-keygen -t ed25519 -C "your_email@example.com"

What happens: - You’ll be prompted to choose a file location (press Enter to accept the default: `~/.ssh/id_ed25519`) - You’ll be asked to enter a passphrase (press Enter twice for no passphrase, or enter a passphrase for additional security) - Two files will be created: - `~/.ssh/id_ed25519` (private key - keep this secure!) - `~/.ssh/id_ed25519.pub` (public key - this will be copied to the remote server)

Note: If you already have an existing SSH key pair and want to use it, you can skip this step.

### 2. Copy the public key to the remote server

Install your public key on the remote server to enable passwordless login:

    ssh-copy-id user@hpc-login

Replace `user` with your actual username on the remote server.

What happens: - You’ll be prompted to enter your password for the remote server - Your public key will be added to `~/.ssh/authorized_keys` on the remote server - Future connections will not require a password

Alternative method (if `ssh-copy-id` is not available):

    cat ~/.ssh/id_ed25519.pub | ssh user@hpc-login "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

Windows users:

If using PowerShell on Windows:

    type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh user@hpc-login "cat >> ~/.ssh/authorized_keys"

Or use a Git Bash terminal for the Unix-style commands.

### 3. Test the connection

Verify that passwordless SSH login works:

    ssh user@hpc-login

Expected result: - You should be logged into the remote server without being prompted for a password - Type `exit` to close the connection

### 4. Test with R

Verify the connection works from R:

    library(ssh)

    # Create SSH session
    session <- ssh_connect("user@hpc-login")

    # Run a test command
    ssh_exec_wait(session, command = "hostname")

    # Disconnect
    ssh_disconnect(session)

If this works without prompting for a password, your setup is complete!

## Troubleshooting

### Connection still asks for password

Check file permissions on the remote server:

    ssh user@hpc-login "chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys"

Verify your public key was added:

    ssh user@hpc-login "cat ~/.ssh/authorized_keys"

You should see your public key listed.

### SSH key not found

If you saved your key with a non-default name, you may need to specify it:

    ssh -i ~/.ssh/my_custom_key user@hpc-login

Or add it to your SSH config file (`~/.ssh/config`):

    Host hpc-login
        HostName hpc-login.example.com
        User user
        IdentityFile ~/.ssh/my_custom_key

### Using SSH agent (optional, for keys with passphrases)

If you used a passphrase for your SSH key, you can use an SSH agent to avoid entering it repeatedly:

    # Start the SSH agent
    eval "$(ssh-agent -s)"

    # Add your key to the agent
    ssh-add ~/.ssh/id_ed25519

## Security Best Practices

1. Never share your private key (`~/.ssh/id_ed25519`) - keep it secure on your local machine only
2. Use a passphrase for your SSH key for additional security (especially on shared machines)
3. Set proper file permissions:
   - Private key: `chmod 600 ~/.ssh/id_ed25519`
   - SSH directory: `chmod 700 ~/.ssh`
4. Use different keys for different servers if working with sensitive systems
5. Regularly rotate keys and remove old keys from `authorized_keys` files

## Additional Resources

- SSH Academy - SSH Keys
- GitHub SSH Documentation
- R ssh package documentation