๐Ÿ” SSH Config Generator

Visually create SSH config files with multi-host, jump host, proxy, key auth, and port forwarding support.

Zero Dependencies ยท Works Offline

๐Ÿ–ฅ๏ธ Host Configuration

๐Ÿ“„ Generated Config

What Can the SSH Config Generator Do?

The SSH Config Generator is a free online tool that helps developers and sysadmins visually create SSH config files. Instead of manually editing config files, use the form interface to add hosts, configure key authentication, set up jump hosts, define port forwarding rules, and the tool automatically generates a standard SSH config file. It supports multi-host management, ProxyJump chains, SOCKS proxy, local/remote port forwarding, and other advanced features.

Core Features

How to Use

1. Click "Add Host" to create a new SSH host configuration

2. Fill in host alias, address, port, username, and other basic info

3. Expand advanced options for key, jump host, port forwarding settings

4. Add more hosts or use preset templates

5. Click "Copy Config" or "Download File" to get the SSH config

Use Cases

Case 1: Multi-server Management

Sysadmins managing dozens of servers use SSH config aliases to connect with simple commands like ssh prod-web1, without memorizing IPs and ports.

Case 2: Bastion Host Access

Access internal servers through a bastion host. With ProxyJump configured, SSH automatically builds the jump chain โ€” one command to reach the target.

Case 3: Port Forwarding

Developers use SSH local port forwarding to access remote databases and internal services without additional VPN tools.

Extended Knowledge

The SSH config file is the OpenSSH client configuration file, located at ~/.ssh/config. It allows users to define aliases and parameters for different SSH connections, avoiding lengthy command-line arguments. Common options include Host (alias), HostName (address), User (username), Port, IdentityFile (key path), ProxyJump (jump host). SSH supports three types of port forwarding: local (-L) maps remote ports to local, remote (-R) maps local ports to remote, and dynamic (-D) creates a SOCKS proxy. ServerAliveInterval prevents SSH connections from timing out due to inactivity.

FAQ

Where is the SSH config file?โ–ผ
The SSH config file is typically at ~/.ssh/config (Linux/macOS) or C:\Users\Username\.ssh\config (Windows). Create it manually if it doesn't exist.
What is SSH ProxyJump?โ–ผ
A jump host (bastion) is an intermediate server used when you can't directly access the target. SSH connects to the jump host first, then to the target server.
What types of SSH port forwarding exist?โ–ผ
Three types: Local forwarding (LocalForward, maps remote port to local), Remote forwarding (RemoteForward, maps local port to remote), Dynamic forwarding (DynamicForward, SOCKS proxy).
How to use SSH key authentication?โ–ผ
Specify IdentityFile path in config pointing to your private key (e.g., ~/.ssh/id_rsa). Add the public key to the remote server's ~/.ssh/authorized_keys file.
Is my data uploaded to any server?โ–ผ
No. This tool runs entirely in your browser. All config generation is done client-side with no data uploaded to any server.

SSH Config Generator | No Signup, Client-Side ยท No Server Uploads

Feedback: dexshuang@google.com

โ–ถ Show Advanced
`).join('');} function generateConfig(){if(hosts.length===0){document.getElementById('config-text').textContent='# Click "Add Host" to start configuring';return;}const lines=[];hosts.forEach(h=>{if(!h.alias)return;lines.push(`Host ${h.alias}`);if(h.hostname)lines.push(` HostName ${h.hostname}`);if(h.user)lines.push(` User ${h.user}`);if(h.port&&h.port!=='22')lines.push(` Port ${h.port}`);if(h.identityFile)lines.push(` IdentityFile ${h.identityFile}`);if(h.proxyJump)lines.push(` ProxyJump ${h.proxyJump}`);if(h.localForward)lines.push(` LocalForward ${h.localForward}`);if(h.remoteForward)lines.push(` RemoteForward ${h.remoteForward}`);if(h.dynamicForward)lines.push(` DynamicForward ${h.dynamicForward}`);if(h.serverAliveInterval)lines.push(` ServerAliveInterval ${h.serverAliveInterval}`);if(h.compression)lines.push(` Compression yes`);if(h.forwardAgent)lines.push(` ForwardAgent yes`);if(h.strictHostKeyChecking&&h.strictHostKeyChecking!=='yes')lines.push(` StrictHostKeyChecking ${h.strictHostKeyChecking}`);lines.push('');});document.getElementById('config-text').textContent=lines.join('\n');} function addPreset(type){if(type==='bastion'){addHost({alias:'bastion',hostname:'bastion.example.com',user:'deploy',port:'22',identityFile:'~/.ssh/bastion_key',proxyJump:'',localForward:'',remoteForward:'',dynamicForward:'',serverAliveInterval:'60',compression:false,strictHostKeyChecking:'accept-new',forwardAgent:false});addHost({alias:'prod-server',hostname:'10.0.1.100',user:'admin',port:'22',identityFile:'~/.ssh/prod_key',proxyJump:'bastion',localForward:'3306 localhost:3306',remoteForward:'',dynamicForward:'',serverAliveInterval:'60',compression:false,strictHostKeyChecking:'accept-new',forwardAgent:false});}else if(type==='github'){addHost({alias:'github',hostname:'github.com',user:'git',port:'22',identityFile:'~/.ssh/id_ed25519',proxyJump:'',localForward:'',remoteForward:'',dynamicForward:'',serverAliveInterval:'60',compression:false,strictHostKeyChecking:'accept-new',forwardAgent:false});}} function loadExample(){hosts=[];hostId=0;addHost({alias:'bastion',hostname:'bastion.example.com',user:'deploy',port:'22',identityFile:'~/.ssh/bastion_key',proxyJump:'',localForward:'',remoteForward:'',dynamicForward:'',serverAliveInterval:'60',compression:false,strictHostKeyChecking:'accept-new',forwardAgent:false});addHost({alias:'web-prod',hostname:'10.0.1.50',user:'admin',port:'22',identityFile:'~/.ssh/prod_key',proxyJump:'bastion',localForward:'8080 localhost:80',remoteForward:'',dynamicForward:'',serverAliveInterval:'60',compression:false,strictHostKeyChecking:'accept-new',forwardAgent:false});addHost({alias:'db-prod',hostname:'10.0.1.60',user:'dba',port:'22',identityFile:'~/.ssh/prod_key',proxyJump:'bastion',localForward:'3306 localhost:3306',remoteForward:'',dynamicForward:'',serverAliveInterval:'60',compression:false,strictHostKeyChecking:'accept-new',forwardAgent:false});addHost({alias:'github',hostname:'github.com',user:'git',port:'22',identityFile:'~/.ssh/id_ed25519',proxyJump:'',localForward:'',remoteForward:'',dynamicForward:'',serverAliveInterval:'60',compression:false,strictHostKeyChecking:'accept-new',forwardAgent:false});} function copyConfig(){const text=document.getElementById('config-text').textContent;navigator.clipboard.writeText(text).then(()=>{const t=document.getElementById('copy-toast');t.classList.add('show');setTimeout(()=>t.classList.remove('show'),2000);});} function downloadConfig(){const text=document.getElementById('config-text').textContent;const blob=new Blob([text],{type:'text/plain'});const a=document.createElement('a');a.href=URL.createObjectURL(blob);a.download='config';a.click();} function toggleFaq(el){el.parentElement.classList.toggle('open');} document.addEventListener('keydown',function(e){if(e.ctrlKey&&e.key==='Enter'){copyConfig();e.preventDefault();}if(e.ctrlKey&&e.shiftKey&&e.key==='C'){copyConfig();e.preventDefault();}}); addHost();