Introduction¶
DSH breaks down tool capabilities into plugins. When developing agents, if the local harness needs to operate on the shell, file system, terminal, and LSP on another machine, the common practice is to forward commands one by one to the remote for execution. dsh-ssh is a DeepSeek Harness SSH remote-execution plugin maintained by UynajGI, which uses a single SSH connection to execute Bash, file tools, PTY terminal, and LSP on a remote host.
What is This¶
dsh-ssh is an SSH remote-execution plugin for DSH. Built on ssh2, it provides remote providers for ctx.subprocess and ctx.fs, allowing the local DSH to retain processes while command execution, file access, and PTY are handled on the remote end. It supports multi-hop ProxyJump chains, SFTP upload/download, and full authentication coverage.
Core Features¶
The capabilities listed below are derived from verified plugin descriptions:
- SSH remote-execution plugin for DeepSeek Harness
- Moves Bash, file tools, PTY terminals, and LSP onto a remote host over a single SSH connection
- Multi-hop ProxyJump chains
- SFTP upload/download
- Full authentication coverage
- Built on
ssh2 - Remote providers for
ctx.subprocessandctx.fs - Web Add-workspace flow with connection sidebar and directory browser
~/.ssh/confighost alias resolution and registration- Local native folder picker via
local.pickNative - Connection management and remote directory browsing over the
/dsh-sshRPC channel
Installation and Enabling¶
Installation command:
npm i dsh-ssh
When enabling, you can first mount the aggregation row in cordis.yml. host, username, and cwd are required; cwd must be an absolute POSIX path.
- id: ssh-remote
name: dsh-ssh
config:
host: server.example.com
port: 22
username: root
privateKey: ~/.ssh/id_ed25519
cwd: /root/workspace
If the target requires a jump host, you can add a jump array. The first hop in the array starts from the local machine, and the last hop points to the target host.
jump:
- host: bastion.example.com
If you need to combine providers separately in the deployment, you can mount subpath rows individually:
- id: ssh
name: dsh-ssh/ssh
- id: subprocess-ssh
name: dsh-ssh/subprocess
- id: fs-ssh
name: dsh-ssh/fs
When strictHostKeyChecking is set to true, knownHosts must be configured.
Web Add-workspace Usage¶
When enabling the dsh-ssh Add-workspace flow on the web, you need to first disable the dynamic directory picker row and then insert the SSH backend. Here, the name is used as a matching condition, so disabling by id is more appropriate.
- id: directory-picker
name: '@deepseek-ai/dsh-host-directory-picker-auto'
disabled: true
- insert:
- id: ssh-remote
name: dsh-ssh
config: { ...same config as the quick start... }
- id: directory-picker-ssh
name: dsh-ssh/picker
- id: ssh-web-channel
name: dsh-ssh/web
When selecting a remote directory, first call session.route to obtain a local placeholder cwd, then create the session.
const { cwd } = await rpc('session.route', { id: connectionId, path: remotePath })
ctx.sessions.create({ cwd })
Use Cases and Notes¶
This is suitable for scenarios where the local DSH needs to drive the shell, file tools, PTY terminal, and LSP on a remote host. Verified materials clearly state that the harness does not need to be installed on the remote.
It is recommended to review the source code and MIT license before use. The plugin runs with the permissions of the current dsh process. Before installation, you should confirm whether the credentials, files, and permissions accessible by the local process meet your expectations.
Additionally, remote sessions do not enter the DSH local workspace registry. The fetched README and the end of package.json are truncated, and the subsequent scripts and complete limitations are not fully displayed. Therefore, do not rely on the undisclosed limitation descriptions for a complete security assessment.
Links¶
- GitHub: https://github.com/UynajGI/dsh-ssh
- Directory Page (standalone directory site from plugin clues): https://www.skillhub.cn/plugins/UynajGI/dsh-ssh