<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: DHLPTX00</title>
    <description>The latest articles on DEV Community by DHLPTX00 (@dhlptx00).</description>
    <link>https://dev.to/dhlptx00</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4152105%2F77078f92-4bc3-45bc-b8f4-874543964014.jpg</url>
      <title>DEV Community: DHLPTX00</title>
      <link>https://dev.to/dhlptx00</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dhlptx00"/>
    <language>en</language>
    <item>
      <title>I built an SSH terminal for VS Code and Cursor where Ctrl+click downloads the file</title>
      <dc:creator>DHLPTX00</dc:creator>
      <pubDate>Wed, 30 Sep 2026 12:31:43 +0000</pubDate>
      <link>https://dev.to/dhlptx00/i-built-an-ssh-terminal-for-vs-code-and-cursor-where-ctrlclick-downloads-the-file-296f</link>
      <guid>https://dev.to/dhlptx00/i-built-an-ssh-terminal-for-vs-code-and-cursor-where-ctrlclick-downloads-the-file-296f</guid>
      <description>&lt;p&gt;I'm a solo developer, and this is a short write-up of a small, free, MIT-licensed extension I made: &lt;strong&gt;Easy SSH&lt;/strong&gt;, an SSH terminal that lives inside VS Code and Cursor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F91udvnv7bywcuoke0v0b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F91udvnv7bywcuoke0v0b.png" alt="Easy SSH overview: saved connections, sign-in options, jump hosts, a real login shell, Ctrl+click or Cmd+click to download, and drop to upload" width="800" height="647"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The itch
&lt;/h3&gt;

&lt;p&gt;Most of my SSH sessions are not "develop on the server" sessions. They're "log in, look at something, grab a file, maybe upload a config" sessions. For that I wanted:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a list of my servers, including ones behind a bastion&lt;/li&gt;
&lt;li&gt;a normal login shell, not a special file browser&lt;/li&gt;
&lt;li&gt;a way to get a file off the box without switching to &lt;code&gt;scp&lt;/code&gt; and retyping the path&lt;/li&gt;
&lt;li&gt;nothing installed on the server, and no remote editor downloaded when I connect&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What it does
&lt;/h3&gt;

&lt;p&gt;Click the Easy SSH icon in the activity bar and you get a connection list in a terminal tab. Type &lt;code&gt;/&lt;/code&gt; for commands (&lt;code&gt;/new&lt;/code&gt;, &lt;code&gt;/edit&lt;/code&gt;, &lt;code&gt;/delete&lt;/code&gt;, &lt;code&gt;/import&lt;/code&gt;, &lt;code&gt;/folder&lt;/code&gt;, &lt;code&gt;/quit&lt;/code&gt;), or press Enter on a connection.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvt1ckcepfc0937htlgz7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvt1ckcepfc0937htlgz7.png" alt="The connection list" width="800" height="429"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Connecting opens your login shell in your home directory. Aliases, &lt;code&gt;vim&lt;/code&gt;, &lt;code&gt;less&lt;/code&gt;, &lt;code&gt;top&lt;/code&gt; and &lt;code&gt;sudo&lt;/code&gt; work as they do over &lt;code&gt;ssh&lt;/code&gt;. Then:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Download a file:&lt;/strong&gt; Ctrl+click its name (Windows/Linux) or Cmd+click it (macOS). It goes to your Desktop, or to a folder you pick with &lt;code&gt;/folder&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;cd&lt;/code&gt; into a directory:&lt;/strong&gt; Ctrl+click (Windows/Linux) or Cmd+click (macOS) its name.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Upload:&lt;/strong&gt; drag a file or folder onto the terminal and it lands in the current remote directory.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hovering a name underlines it and tells you what the click will do, and normal mouse selection still works for copying text.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgwk6640ken23tqm2nia5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgwk6640ken23tqm2nia5.png" alt="Ctrl+click (Cmd+click on macOS) a file name to download it" width="799" height="371"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can sign in with a password, a private key, or an SSH agent. You can hop through one or more jump hosts, and &lt;code&gt;/import&lt;/code&gt; reads &lt;code&gt;~/.ssh/config&lt;/code&gt; while keeping the &lt;code&gt;ProxyJump&lt;/code&gt; chain.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv4s1srw6msecob58ly3x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv4s1srw6msecob58ly3x.png" alt="A shell on staging-db, reached through a jump host" width="800" height="143"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  How it knows where you are
&lt;/h3&gt;

&lt;p&gt;This was the fun part. When the shell starts, Easy SSH sends one line that adds a bash &lt;code&gt;PROMPT_COMMAND&lt;/code&gt; (or zsh &lt;code&gt;precmd&lt;/code&gt;) hook. The hook prints &lt;code&gt;$PWD&lt;/code&gt; as an OSC 7 escape sequence before every prompt. The extension reads that, so it always knows the remote directory, and it doesn't install anything on the server to do it. File and directory names are exposed as VS Code terminal links, which is why it's Ctrl+click on Windows/Linux and Cmd+click on macOS, and why normal mouse selection still works.&lt;/p&gt;

&lt;p&gt;When it &lt;em&gt;can't&lt;/em&gt; know the directory, for example after &lt;code&gt;sudo su&lt;/code&gt;, it doesn't guess. An upload asks whether to use the last known directory, your home directory, or a path you type. Uploads always run over SFTP as the user you logged in as, so Easy SSH shows you the &lt;code&gt;sudo mv&lt;/code&gt; command to finish the job.&lt;/p&gt;

&lt;h3&gt;
  
  
  Limitations (being honest)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;It targets Linux servers, and directory tracking works with bash and zsh.&lt;/li&gt;
&lt;li&gt;A single drop is capped at 5000 files, and symlinks inside dropped folders are skipped.&lt;/li&gt;
&lt;li&gt;It's version 0.1.3 and brand new.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Try it
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;VS Code Marketplace: &lt;a href="https://marketplace.visualstudio.com/items?itemName=easy-ssh.easy-ssh" rel="noopener noreferrer"&gt;https://marketplace.visualstudio.com/items?itemName=easy-ssh.easy-ssh&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Open VSX (Cursor, VSCodium): &lt;a href="https://open-vsx.org/extension/easy-ssh/easy-ssh" rel="noopener noreferrer"&gt;https://open-vsx.org/extension/easy-ssh/easy-ssh&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Source and issues: &lt;a href="https://github.com/dhlptx00/EasySSH" rel="noopener noreferrer"&gt;https://github.com/dhlptx00/EasySSH&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bug reports and "this broke on my server" stories are the most useful thing you could send me.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If it saves you time, there's a &lt;a href="https://buymeacoffee.com/dhlptx00" rel="noopener noreferrer"&gt;Buy Me a Coffee&lt;/a&gt; link. No pressure.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: I used AI assistance for parts of the code and this write-up; I reviewed and tested everything myself.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>vscode</category>
      <category>ssh</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
