VRAMfarm logo VRAMfarm
EN
Sign up

12 November 2026 · VRAMfarm team

SSH into a GPU server from Windows 10 and 11: key, connect, fix errors

A Windows laptop with PowerShell open, connected by a key to a GPU server: how to SSH into a GPU server from Windows

Windows 10 and 11 already include the same ssh client that Mac and Linux guides use, so you don’t need PuTTY. Getting onto a GPU server takes five commands in PowerShell and about five minutes: check that ssh is there, create a key, copy the .pub file, paste it into the dashboard, and run the connect command from My servers. Most “Permission denied” errors on Windows come from three mistakes, and all three are covered below.

If you would rather not touch SSH at all, skip to the Jupyter section: every server also has a terminal in the browser.

Check that OpenSSH is installed

Open PowerShell (Start menu, type “PowerShell”) or Windows Terminal. Run:

ssh -V

You should see a version line such as OpenSSH_for_Windows_9.5. Windows 10 since the 2018 updates and every Windows 11 build ship the client switched on.

If you get “ssh is not recognized as an internal or external command”, install it: Settings → System → Optional features on current Windows 11 builds (Settings → Apps → Optional features on Windows 10 and older Windows 11 builds) → Add a feature (or View features) → OpenSSH Client. Close PowerShell, open it again, and run ssh -V once more.

The commands in this guide are for PowerShell. They also work in Windows Terminal, which opens PowerShell by default. The old Command Prompt (cmd) runs ssh too, but the commands for copying the key are different there; the cmd version is given where it matters.

Create a key and find the .pub file

First check whether you already have a key:

dir $env:USERPROFILE\.ssh\*.pub

If the list shows id_ed25519.pub, you have one; go to the next section. If it says “Cannot find path”, create a key:

ssh-keygen -t ed25519

Press Enter three times: keep the default location, and leave the passphrase empty unless you want one. If it asks “already exists. Overwrite (y/n)?”, answer n. You already have a key, and overwriting it would break it everywhere else you use it.

The key is two files in C:\Users\<your name>\.ssh\:

File What it is What to do with it
id_ed25519 Private key Stays on your computer. Never paste it anywhere
id_ed25519.pub Public key This one goes into the dashboard

To see the folder, run explorer $env:USERPROFILE\.ssh. You may notice that Windows shows id_ed25519.pub with a Microsoft Publisher icon and the type “Microsoft Publisher Document”. That is only Windows guessing from the .pub ending. Don’t double-click it. Right-click → Open with → Notepad, or just copy it from PowerShell:

Get-Content $env:USERPROFILE\.ssh\id_ed25519.pub | Set-Clipboard

In Command Prompt the same is type %USERPROFILE%\.ssh\id_ed25519.pub | clip. The clipboard now holds one line that starts with ssh-ed25519, followed by a long string and your computer’s name.

Paste the key and connect

In the dashboard, open Settings → Server access → Public SSH key, paste the line and click Save key. The key is added to every new server and to servers that are already running. You do this once; the same key works for every server you launch later.

Now open My servers, find your running server and copy its SSH command. It looks like this, with your own port:

ssh -p 31001 root@vramfarm.com

Paste it into PowerShell (right-click pastes in most Windows terminals) and press Enter. On the first connection SSH asks Are you sure you want to continue connecting (yes/no/[fingerprint])?. Type yes. You are now on the server as root. Check the card:

nvidia-smi

It lists the GPU, its memory and the driver version. If you plan to install a specific PyTorch build, the driver and CUDA guide explains how to read that line. Type exit to leave. Every server has its own port, so the command changes each time you launch; the one in My servers is always the current one.

The full step-by-step for Mac and Linux, with the same steps side by side, is in the SSH key guide.

“Permission denied (publickey)” and other Windows errors

Permission denied (publickey), or it asks for a password

The server did not accept your key. Servers have no password, so a password prompt means the same thing. On Windows it is almost always one of these:

  1. The wrong thing was pasted. Compare the line in Settings with Get-Content $env:USERPROFILE\.ssh\id_ed25519.pub. If what you pasted starts with -----BEGIN OPENSSH PRIVATE KEY-----, that is your private key: delete it from the field and paste the .pub line instead.
  2. The line got broken. Copying from Notepad with word wrap, or from an email, can add line breaks. The key must be one unbroken line.
  3. The key has another name. If you saved it as gpu_key or made it in PuTTYgen, ssh won’t find it on its own. Point to it: ssh -i $env:USERPROFILE\.ssh\gpu_key -p 31001 root@vramfarm.com. A .ppk file from PuTTY doesn’t work with this command at all; see the FAQ below.

If you set a passphrase when creating the key, SSH asks for it with the words Enter passphrase for key. That is the password of your key, not of the server.

WARNING: UNPROTECTED PRIVATE KEY FILE

SSH refuses a private key that other Windows users can read, which happens when the file was copied from another computer or a shared folder. Fix the permissions so only you can read it:

icacls $env:USERPROFILE\.ssh\id_ed25519 /inheritance:r /grant:r "$($env:USERNAME):(R)"

REMOTE HOST IDENTIFICATION HAS CHANGED

Servers come and go, and a port you used last week may now belong to a different server. Your computer remembers the old one and warns you. Remove the old entry for that port, then connect again:

ssh-keygen -R "[vramfarm.com]:31001"

Connection refused, or connection timed out

Refused usually means the server is still starting or has already stopped: wait for the Running status in My servers. Timed out on an office or university network often means the network blocks outgoing connections to unusual ports. Try a phone hotspot to confirm. If that is the cause, use the Jupyter terminal below, which runs over normal HTTPS in your browser.

It asks for the key passphrase every time

Let the Windows ssh-agent remember it. In PowerShell opened as administrator:

Get-Service ssh-agent | Set-Service -StartupType Automatic
Start-Service ssh-agent
ssh-add $env:USERPROFILE\.ssh\id_ed25519

No SSH at all: the terminal in Jupyter

You can skip keys entirely. In My servers, click Open Jupyter, then File → New → Terminal. You get a shell on the same server as root, in the browser, with no key and no client software. Everything in this guide that runs on the server (nvidia-smi, pip install, python train.py) works there.

Jupyter’s file browser also handles files: drag files onto the panel on the left to upload, right-click a file → Download to save it on your computer. That suits notebooks, scripts and files up to a few hundred megabytes. For gigabytes, the browser tab has to stay open the whole time and an interrupted upload starts over, so use scp (below) or download straight to the server; the dataset transfer guide compares the options.

One habit worth having from day one: start long jobs inside tmux or with nohup, so they keep running when you close the tab. The guide to idle servers shows both, and how to stop the server automatically when the job ends.

VS Code and Cursor with Remote SSH

Editing files on the server as if they were local is the most comfortable way to work, and it runs over the same SSH key.

  1. In VS Code, install the Remote - SSH extension from Microsoft.
  2. Open C:\Users\<your name>\.ssh\config in Notepad (create the file if it doesn’t exist; make sure Notepad doesn’t add .txt) and add:
Host gpu
    HostName vramfarm.com
    Port 31001
    User root
    IdentityFile ~/.ssh/id_ed25519
  1. Press F1, choose Remote-SSH: Connect to Host…, pick gpu, and choose Linux if asked.
  2. File → Open Folder → /workspace.

On the first connection VS Code installs its server part on the machine, which takes a minute and counts as a small download. It goes to /root/.vscode-server, outside /workspace, so it is installed again on each new server. When you launch a new server, change only the Port line. With the gpu entry in place, ssh gpu in PowerShell works as well.

Cursor works the same way: it has its own Remote SSH extension and reads the same config file.

One thing to know: an open VS Code window keeps an SSH connection alive, and an open connection counts as using the server, just like a PowerShell window with an SSH session you never closed. Idle protection won’t warn you or stop the server while it is open, so close it when you are done, or stop the server.

Copying files with scp

scp comes with the same OpenSSH client. Note the capital -P for the port; ssh uses a lowercase -p.

# upload a file to the server
scp -P 31001 .\dataset.zip root@vramfarm.com:/workspace/

# download one result
scp -P 31001 root@vramfarm.com:/workspace/outputs/result.png .

# download a whole folder
scp -r -P 31001 root@vramfarm.com:/workspace/ComfyUI/output .\output

Thousands of small files copy slowly one by one. Pack them on the server first, then download one archive. Windows 10 and 11 include tar, so you can unpack it without extra tools:

ssh -p 31001 root@vramfarm.com "tar czf /workspace/out.tgz -C /workspace/ComfyUI output"
scp -P 31001 root@vramfarm.com:/workspace/out.tgz .
tar xzf out.tgz

If a recent scp stops with “subsystem request failed”, add -O to use the older copy protocol. rsync, which resumes interrupted transfers, isn’t part of Windows; you can run it inside WSL. If you prefer a window to drag files around in, WinSCP works with the same key: choose SFTP, enter the host and port from My servers, user root, and let it convert your OpenSSH key when it offers.

Every gigabyte you move in or out counts as traffic at the machine’s rate, shown before launch, usually around a cent per GB or less. And before you stop, remember that the server disk is deleted: download what you need or click Save and stop to keep /workspace. What survives and what doesn’t is in what happens to your files when you stop a GPU.

Questions on this topic

Can I rent a server that runs Windows?

No. The servers are Linux containers, which is what PyTorch, ComfyUI and most AI tools expect. You control them from Windows through PowerShell, VS Code or the browser.

I already have a key from PuTTYgen. Can I use it?

Yes. Open the key in PuTTYgen and copy the text in the box labelled as the public key for OpenSSH authorized_keys: one line that starts with ssh-ed25519 or ssh-rsa. Paste that into Settings. PowerShell's ssh can't read .ppk files, so to connect from PowerShell either create a new key with ssh-keygen or export the private key with Conversions, Export OpenSSH key.

Is there a password I can use instead of a key?

No. Servers accept only keys. If you can't get a key working, use Open Jupyter in My servers and start a terminal there: it is the same server, and no key is needed.

Which user name do I log in with?

root. The command in My servers already contains it, together with the host and the port of your server.

Find the GPU your model fits on

Pick a model and see the cheapest card with enough VRAM, billed by the minute in euros.