Remote SSH Deploy
A VS Code extension for working with multiple servers over SSH/SFTP: manage accounts, browse and edit files on the server, auto upload on save, upload from the right-click menu, and open SSH terminals without leaving the editor.
Features
| Feature |
Description |
| Multiple accounts |
Each server is its own configuration: name, group, host, port, user |
| Several auth methods |
Password, private key (with passphrase), SSH agent. Keyboard-interactive and OTP are supported |
| Root path |
The server's root directory, as in PHPStorm. Clicking a server lists everything in it |
| Remote file browser |
The Remote Files panel: view, open, edit and save files directly on the server |
| Path mappings |
Optional — only needed to auto upload from the workspace to the server |
| Auto upload |
Pushes files on save, create and rename. Deleting on the server is opt-in |
| Right-click menu |
Upload, download, delete, diff and copy remote path from the Explorer and the editor |
| SSH terminal |
Runs on the connection the extension already holds, so it never asks for the password again |
| Security |
Passwords live in VS Code's SecretStorage. Host keys are verified trust-on-first-use |
| Per-project servers |
Each workspace keeps its own server list; nothing leaks between projects |
Building
npm install
npm run compile
Open this folder in VS Code and press F5 to launch an Extension Development Host with the extension loaded.
Package it as a .vsix to share with the team:
npx @vscode/vsce package
code --install-extension remote-ssh-deploy-0.1.0.vsix
If code is not on your PATH, run Shell Command: Install 'code' command in PATH from the Command Palette, or call the binary directly at /Applications/Visual Studio Code.app/Contents/Resources/app/bin/code.
Getting started
- Open the Remote SSH icon in the activity bar.
- Click + to add a server. Fill in the host, user and authentication method.
- Set the Root path — the server's root directory, for example
/var/www/html. Autodetect fills in the user's home directory.
- Click Test connection. It reports whether the root path exists and how many entries it holds.
- Click Save.
That is enough to start working: the Remote Files panel lists everything under the root path, clicking a file opens it for editing, and Cmd+S writes it straight back to the server. SSH terminals work at this point too.
Already have a ~/.ssh/config? Use Import from ~/.ssh/config in the view's ... menu to pull in your hosts.
Path mappings (optional)
Add a mapping only if you want files pushed automatically from the workspace to the server. Each mapping pairs a local directory with a directory on the server:
- Use
${workspaceFolder} for the local path so the configuration works on every machine on the team.
- A remote path that does not start with
/ is resolved against the root path, the same way PHPStorm does it.
Without a mapping, auto upload is simply off; everything else works as normal.
Day-to-day use
Auto upload — save a file and it goes to every server that has auto upload enabled and a matching mapping. Results appear in the status bar and the Output panel.
Right-click in the Explorer — select one or more files or folders:
- Upload to default server (
Cmd+Alt+U)
- Upload to server... — pick a different one, handy for pushing to staging and then production
- Download from default server
- Compare with version on server — opens VS Code's diff view
- Delete on default server
- Copy remote path
The status bar at the bottom right always names the current default server; click it to switch. VS Code does not allow menu item titles to change at runtime, so the menu says "default server" rather than naming it. If you want the name confirmed at the moment you upload, turn on remoteSsh.confirmUploadTarget.
Browse the server — the Remote Files panel. Click a server to list its root path, click a file to open it, then Cmd+S to save it back. Right-click for download, rename, delete, new folder, or Add to workspace to treat a remote directory like any other project folder.
Open an SSH terminal — Cmd+Alt+S, or the terminal icon next to a server. It runs on the extension's own SSH connection, so it reuses the stored password or key, never prompts again, and starts in the root path.
If you need ~/.ssh/config, ProxyJump or agent forwarding, set remoteSsh.terminalMode to systemSsh to use the system ssh command instead — at the cost of ssh doing its own password prompt.
Settings
Open Settings and search for remoteSsh:
| Key |
Default |
Meaning |
remoteSsh.serverStorage |
workspace |
Where the server list lives: workspace (each project its own) or global (shared) |
remoteSsh.autoUpload |
true |
Master switch for auto upload |
remoteSsh.uploadOnSave |
true |
Upload on save |
remoteSsh.uploadOnCreate |
true |
Upload newly created files |
remoteSsh.deleteRemoteOnDelete |
false |
Delete on the server when deleted locally |
remoteSsh.exclude |
.git, node_modules, ... |
Globs that are never uploaded |
remoteSsh.concurrency |
4 |
Files uploaded in parallel |
remoteSsh.confirmBeforeFolderUpload |
true |
Ask before pushing a whole folder |
remoteSsh.confirmUploadTarget |
true |
Name the target server before a manual upload (the right-click menu cannot show it) |
remoteSsh.terminalMode |
builtin |
builtin reuses the extension's connection; systemSsh calls ssh |
remoteSsh.terminalCommand |
"" |
Custom SSH command template (systemSsh only) |
Each server additionally has its own auto upload switch, its own exclude list, and optional chown / chmod to apply after upload.
Security notes
- Passwords and passphrases are kept in VS Code's SecretStorage (the macOS Keychain), never in
settings.json and never in a file that could be committed by accident.
- The first connection to a host shows its fingerprint for confirmation before storing it. If the fingerprint changes later, the extension warns you — that can mean a man-in-the-middle attack, or simply that the server was rebuilt.
- Skip host key verification should only be used on a trusted network.
- The server list is stored per workspace, so two projects never see each other's servers. Set
remoteSsh.serverStorage to global to go back to one shared list; a window with no folder open always uses the global list.
- Servers saved by earlier versions live in global storage. The first time a project opens, the extension offers to copy them in; Remote SSH: Import servers from global storage does the same on demand. Each copy gets its own id and its own stored password, so deleting it in one project leaves the others alone.