12 November 2026 · VRAMfarm team
SSH into a GPU server from Windows 10 and 11: key, connect, fix errors
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:
- 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.publine instead. - 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.
- The key has another name. If you saved it as
gpu_keyor made it in PuTTYgen,sshwon’t find it on its own. Point to it:ssh -i $env:USERPROFILE\.ssh\gpu_key -p 31001 root@vramfarm.com. A.ppkfile 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.
- In VS Code, install the Remote - SSH extension from Microsoft.
- Open
C:\Users\<your name>\.ssh\configin 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
- Press F1, choose Remote-SSH: Connect to Host…, pick
gpu, and choose Linux if asked. - 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.