Bundle
dsh-plugin-ftp-server
Run a configurable FTP file server inside DeepSeek Harness, managed from a browser settings panel (host a shared directory over plain FTP).
- Source
- YinjiangCN
- stars
- 1 stars
- License
- MIT
- Updated
- Updated yesterday
Readme
# dsh-plugin-ftp-server Run a **configurable FTP file server** inside [DeepSeek Harness](https://github.com/deepseek-ai/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 ```bash 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
Install
dsh plugin --profile web add github:YinjiangCN/dsh-plugin-ftp-server
Profile: web
With the hub plugin installed, ask your agent to install it by name — it resolves the same plan shown here.
dsh plugin --profile web add github:stvlynn/dsh.fish#path:packages/dsh-plugin-hub
install dsh-plugin-ftp-server from the hub
- This source has no pinned commit, so a later push upstream changes what installs. Prefer pinning a commit.