Skip to content
| Marketplace
Sign in
Visual Studio Code>Other>Remote SSH DeployNew to Visual Studio Code? Get it now.
Remote SSH Deploy

Remote SSH Deploy

Mimoran

|
20 installs
| (0) | Free
Manage multiple SSH servers, auto upload on save, browse and edit files on the server, and open SSH terminals inside VS Code. Also shows a file's Git history and, for Magento, jumps from di.xml and other XML to classes and methods and from interfaces to their implementations.
Installation
Launch VS Code Quick Open (Ctrl+P), paste the following command, and press enter.
Copied to clipboard
More Info

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. It also shows a file's Git history and, in Magento projects, jumps from di.xml and other XML to the classes and methods they name, and from interfaces to the classes that implement them.

What changed in each version is in CHANGELOG.md, also shown on the extension's Changelog tab.

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
File history Right-click a file to list the Git commits that touched it, with full messages, and open any of them as a diff
Jump to code Cmd+Click a class or method in di.xml, webapi.xml, crontab.xml and other Magento XML to open it, and jump from an interface to the classes implementing it; works in PHP files opened from the server too
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.9.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

  1. Open the Remote SSH icon in the activity bar.
  2. Click + to add a server. Fill in the host, user and authentication method.
  3. Set the Root path — the server's root directory, for example /var/www/html. Autodetect fills in the user's home directory.
  4. Click Test connection. It reports whether the root path exists and how many entries it holds.
  5. 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.

File history — right-click a file in the Explorer, the editor, its tab or the Source Control view and pick Show file history. It opens a History tab listing every commit that touched the file, following renames, with the full commit message wrapped onto as many lines as it needs. Type in the box at the top to filter by message, hash, author or path. Click a commit (or move with the arrow keys and press Enter) to see what it changed in a diff beside the list, or use Compare with current on a row to diff that version against the current file.

Jump to code — in Magento XML, Cmd+Click (or F12) a class name to open its file, and a method to land on it:

  • class names anywhere: <preference>, <type>, <plugin>, <argument xsi:type="object">, source_model, ...
  • method="..." next to class="..." or instance="...", as in webapi.xml and crontab.xml
  • Vendor\Module\Model\Foo::method and Foo::CONSTANT
  • virtual type names, which jump to their <virtualType> declaration
  • factories, proxies and interceptors, which open the class they wrap when the generated file is missing

Classes are found through vendor/composer/autoload_psr4.php, app/code, generated/code and the module's own registration.php, so it works without Composer having been run and on files opened from the server. In PHP files opened from the server — which no PHP language server can index — the same works for class names, $this->method(), $this->property->method(), self::, parent:: and constants, following parent classes, traits and interfaces. Local PHP files are left to Intelephense or PHP Tools when one is installed.

Jump to implementations — Cmd+Click a method in an interface, or the interface's name, where it is declared, to go to the classes that implement it. Cmd+F12 (Go to Implementations) does the same from anywhere: a call such as $this->productRepository->getById(), a type hint, or an interface or method="..." in XML. The type set by <preference> in di.xml comes first, then every class that implements the interface, including through sub-interfaces and abstract classes; generated interceptors are left out. Files on disk are searched with the ripgrep that ships with VS Code, and files opened from the server with grep over SSH, so nothing is downloaded. With Intelephense installed, Cmd+Click on an interface method shows the declaration alongside the implementations.

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, .idea, .DS_Store, *.log Globs that are never uploaded. Everything else is, vendor included; add **/vendor/** here or in a server's Exclude box to skip it
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.
  • Contact us
  • Jobs
  • Privacy
  • Manage cookies
  • Terms of use
  • Trademarks
  • Your Privacy Choices
  • Consumer Health Privacy
© 2026 Microsoft