skssh is an SSH connection manager for Emacs. It provides a tabulated host list where you can add, edit, delete, and connect to SSH hosts without leaving Emacs.
Connections use TRAMP under the hood, giving you full Emacs integration: shell buffers, Dired, and file editing all work over SSH out of the box.
A built-in dual-pane SFTP interface lets you transfer files between local and remote directories. Drag-and-drop and paste-path transfer are supported in terminal Emacs.
Host configuration is stored in ~/.emacs.d/skssh/hosts.el and
never touches ~/.ssh/config. You can import existing hosts from
~/.ssh/config as a one-time operation.
Requires Emacs 29.1+.
(use-package skssh)Clone the repository and add to your load-path:
(add-to-list 'load-path "/path/to/skssh")
(require 'skssh)| Command | Description |
|---|---|
M-x skssh | Open host list |
M-x skssh-add-host | Add a new SSH host interactively |
M-x skssh-import-from-ssh-config | Import hosts from ~/.ssh/config |
M-x skssh-sftp | Open dual-pane SFTP for a host |
| Key | Action |
|---|---|
RET / ? | Open action menu (transient) |
s | Connect: Shell |
d | Connect: Dired |
f | Open SFTP dual-pane |
e | Edit host |
D | Delete host |
a | Add host |
i | Import from ~/.ssh/config |
/ | Filter by label / host / group |
G | Filter by group (exact match) |
q | Quit |
Shell buffers opened by skssh activate skssh-shell-mode.
| Key | Action |
|---|---|
C-c C-q | Kill shell buffer, return to host list |
Dired buffers opened by skssh activate skssh-dired-mode.
| Key | Action |
|---|---|
C-c C-q / q | Kill dired buffer, return to host list |
| Key | Action |
|---|---|
C | Copy marked files to opposite pane |
TAB | Switch pane |
RET | Enter directory |
^ | Go up one directory |
g | Refresh both panes |
H | Toggle links/user/group columns |
h | Show key reference (transient) |
q | Quit SFTP, return to host list |
In terminal Emacs, drag a file from your desktop onto the terminal —
the terminal delivers it as a bracketed-paste event. You can also
copy a file path and use C-y. skssh intercepts the paste and
transfers the file to the opposite pane instead of trying to insert
text into the read-only dired buffer.
Transfer direction is determined by which pane has focus:
- Focus remote pane (
TABto switch) → file is uploaded local → remote - Focus local pane → file is downloaded remote → local
Supports Unix/macOS paths (/path/to/file, ~/file) and Windows
paths (C:\file, C:/file).
By default skssh opens a login + interactive shell so that
.bash_profile, .bashrc, .zprofile, and .zshrc are all
sourced.
;; Remote shell program (default: /bin/bash)
(setq skssh-shell-file-name "/bin/zsh")
;; Arguments passed to the shell
;; -l = login shell (sources .bash_profile / .zprofile)
;; -i = interactive shell (sources .bashrc / .zshrc)
(setq skssh-shell-args '("-l" "-i"))Set :shell and :shell-args when editing a host (e in the host
list) to override the global defaults for that host only.
skssh does not store passwords. When no :identity key is set,
TRAMP uses auth-source to look up credentials:
~/.authinfo.gpg(recommended — GPG encrypted)~/.authinfo(plain text)- Minibuffer prompt (interactive fallback)
Hosts are stored in ~/.emacs.d/skssh/hosts.el as a list of Emacs
Lisp plists. The file is managed entirely by skssh; do not edit it
by hand.
((:id "abc-123"
:label "Production"
:host "192.168.1.10"
:user "deploy"
:port 22
:identity "~/.ssh/id_ed25519"
:groups ("prod" "web")
:shell nil ; nil = use skssh-shell-file-name
:shell-args nil ; nil = use skssh-shell-args
:notes ""))| Variable | Default | Description |
|---|---|---|
skssh-config-file | ~/.emacs.d/skssh/hosts.el | Path to host storage file |
skssh-shell-file-name | "/bin/bash" | Default remote shell program |
skssh-shell-args | '("-l" "-i") | Default shell arguments |
skssh-sftp-hide-detail-columns | t | Hide links/user/group columns in SFTP panes |
- ProxyJump (multi-hop connections)
- SSH key management / ssh-agent status
MIT License