dsh-plugin-ftp-server
Run a configurable FTP file server inside DeepSeek Harness, managed from a browser settings panel. Host any directory over plain FTP — browse, upload, download, rename and delete files with any FTP client.
⚠️ Plain FTP has no TLS: credentials and data travel in cleartext. Use it on trusted networks only.
Features
- Zero-dependency FTP server core (pure Node built-ins), spawned as a child process of the harness
- Full command support:
USER/PASS,PWD/CWD/CDUP,LIST/NLST/MLSD,RETR/STOR/APPE/STOU,DELE/MKD/RMD,RNFR/RNTO,SIZE/MDTM/REST(resume),PASV/EPSV/PORT,FEAT/STAT/ABOR/NOOP - Chrooted to the shared root — path escape (
..) is blocked, and the root itself cannot be deleted or renamed - Single account + password, or anonymous mode
- Browser panel (Settings → FTP 服务): configure host/port/root/credentials, start/stop, live status (PID, uptime), shared-root listing and server log
- Idle timeout (180 s), crash detection, automatic child-process cleanup when the plugin is stopped
Install
dsh plugin --profile web add github:YinjiangCN/dsh-plugin-ftp-server
Then restart dsh. Open Settings → FTP 服务, fill in the form and click 启动服务.
Usage
| Field | Default | Meaning |
|---|---|---|
| 监听地址 (host) | 0.0.0.0 |
Bind address |
| 端口 (port) | 2121 |
Control port |
| 共享根目录 (root) | workspace/ftp-root |
Directory shared over FTP (created on start) |
| 用户名 (user) | ftp |
Login account (ignored in anonymous mode) |
| 密码 (pass) | (empty) | Login password |
| 允许匿名 (anonymous) | off | Allow anonymous login |
Clients connect with ftp://<user>@<host>:<port>. The password is kept in memory only; it is passed as a child-process argument and never written to disk.
Security notes
- Do not set 共享根目录 to
/unless you really want to share the whole filesystem — anyone with the credentials can read/modify every file (the server runs with the harness user's privileges). - Plain FTP is unencrypted; prefer an internal/trusted network.
- The server supports one account; for multiple users run multiple instances on different ports.
Development
lib/index.js host half — FTP process management + Typert Remote service `ftpServer`
lib/client.js browser half — settings panel (module-loader bundle)
lib/ftp-server.js standalone FTP server (spawned by the host half)
cordis.patch.yml loader patch mounting the host half
The host half registers the ftpServer Remote service; the panel calls status/start/stop/listRoot through the Typert Gateway (host-side SRC-mode discovery with hand-written strict client descriptors).
License
MIT
No comments yet. Be the first to write one.