{"id":26902314,"url":"https://github.com/qiuhaotc/webssh","last_synced_at":"2025-10-18T14:32:40.448Z","repository":{"id":47320872,"uuid":"289646137","full_name":"qiuhaotc/WebSSH","owner":"qiuhaotc","description":"WebSSH allows you to SSH to your remote host anytime, anywhere.","archived":false,"fork":false,"pushed_at":"2025-03-21T05:22:28.000Z","size":4571,"stargazers_count":37,"open_issues_count":0,"forks_count":7,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-21T06:19:59.354Z","etag":null,"topics":["secure-shell","ssh","ssh-client","web-ssh","web-terminal","webssh","webterminal"],"latest_commit_sha":null,"homepage":"https://webssh.azurewebsites.net","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/qiuhaotc.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-08-23T08:30:12.000Z","updated_at":"2025-03-21T05:22:32.000Z","dependencies_parsed_at":"2024-02-18T14:34:19.842Z","dependency_job_id":null,"html_url":"https://github.com/qiuhaotc/WebSSH","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qiuhaotc%2FWebSSH","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qiuhaotc%2FWebSSH/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qiuhaotc%2FWebSSH/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qiuhaotc%2FWebSSH/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/qiuhaotc","download_url":"https://codeload.github.com/qiuhaotc/WebSSH/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246612439,"owners_count":20805355,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["secure-shell","ssh","ssh-client","web-ssh","web-terminal","webssh","webterminal"],"created_at":"2025-04-01T09:18:41.994Z","updated_at":"2025-10-18T14:32:40.443Z","avatar_url":"https://github.com/qiuhaotc.png","language":"C#","readme":"# WebSSH\n\nEnglish | [中文](README_CN.md)\n\nWebSSH allows you to SSH to your remote host anytime, anywhere.\n\n## Demonstrate Page\n\nCheck \u003chttps://webssh.azurewebsites.net\u003e, you can use any login name and password to logged in.\n\n## Usage\n\n### Login\n\nInput the user name and password and captcha to login, user name and password configured in appsettings.json\n\n![Login](https://raw.githubusercontent.com/qiuhaotc/WebSSH/master/docs/LoginToServer.gif)\n\n### Management Connection\n\n![Mangement Connection](https://raw.githubusercontent.com/qiuhaotc/WebSSH/master/docs/ManagementConnection.gif)\n\n### Connected To Server, Running Command\n\nPress the Connect button, connect to the remote server, then run whatever command you want.\n\nGo to management page, will list all available connected servers.\n\nFeatures:\n\n1. Multi lines command\n2. Recall command, in single line mode, press arrow up and down can switch command from history\n3. Press \"ctrl + c\" can run command \"^C\", support \"ctrl + [a-z]\"\n\n![Connected \u0026 Running Command](https://raw.githubusercontent.com/qiuhaotc/WebSSH/master/docs/ConnectedAndRunningCommand.gif)\n\n![Run \u0026 Recall Command](https://raw.githubusercontent.com/qiuhaotc/WebSSH/master/docs/RunCommandAndRecallCommand.gif)\n\n## Real-time (SignalR) Enhancements\n\nFrom the latest version, WebSSH replaces periodic HTTP polling with ASP.NET Core SignalR for a truly real-time terminal experience:\n\n| Area | Before | Now (SignalR) |\n| ---- | ------ | -------------- |\n| Output refresh | 1s / 100ms adaptive polling | Push as soon as data arrives |\n| Bandwidth | Repeated empty responses | Only actual output payloads |\n| Command send | HTTP GET endpoint | Bi-directional hub method `RunCommand` |\n| Initial backlog | Multiple fetches | Single join flush + streaming |\n| Reconnect | Full page reliance | Automatic hub reconnect with status messages |\n\nKey benefits:\n\n1. Lower latency for interactive workflows (vim, tail -f, etc.).\n2. Reduced server \u0026 network overhead – no useless polling cycles.\n3. Better UX with connection state (Connected / Reconnecting / Disconnected).\n4. Extensible channel for future features (file upload, terminal resize, heartbeat).\n\nTechnical notes:\n\n* Hub path: `/shellHub`\n* Group isolation: each browser session + shell GUID =\u003e SignalR group\n* Still keeps an output queue for initial backlog replay on (re)join\n* Automatic reconnect enabled; transient drops will not lose buffered output\n* Legacy endpoints (`GetShellOutput`, `IsConnected`, `RunShellCommand`) have been removed after migration\n\nPlanned (roadmap ideas):\n\n* Terminal resizing sync (cols/rows)\n* Structured output channels (stdout/stderr separation)\n* Optional rate limiting / flood protection\n* Audit log of executed commands\n* ~~Secure copy (SCP / SFTP) integration~~ ✅ **Completed**\n\n## File Transfer Features\n\nWebSSH now supports secure file upload and download to/from remote servers via SFTP with a professional tab-based interface:\n\n### File Upload\n- **Tab-based Interface**: Separate tabs for Shell Console and File Upload\n- **Multiple File Support**: Upload up to 3 files simultaneously (configurable)\n- **File Size Limits**: Maximum 10MB per file (configurable)\n- **Rate Limiting**: IP-based limiting (20 files per hour, configurable)\n- **Real-time Progress**: Live upload status via SignalR\n- **SFTP Integration**: Secure transfer using existing SSH connections\n\n### File Download\n- **Remote File Browser**: Navigate and browse remote directory structure\n- **Multi-file Selection**: Download up to 3 files per operation (configurable)\n- **ZIP Archive Support**: Multiple files automatically packaged for download\n- **Size Limits**: Maximum 20MB total download size (configurable)\n- **Rate Limiting**: IP-based limiting (20 downloads per hour, configurable)\n- **Real-time Progress**: Live download status via SignalR\n\n### Live Demo\n🎯 **[Interactive Demo](https://raw.githubusercontent.com/qiuhaotc/WebSSH/master/docs/demo.html)** - Try the file upload/download interface\n\n### Configuration\nFile transfer restrictions can be configured in `appsettings.json`:\n```json\n{\n  \"ShellConfiguration\": {\n    \"MaxFilesPerUpload\": 3,\n    \"MaxFileSizeMB\": 10,\n    \"MaxFilesPerHour\": 20,\n    \"MaxFilesPerDownload\": 3,\n    \"MaxDownloadSizeMB\": 20,\n    \"MaxDownloadsPerHour\": 20\n  }\n}\n```\n\n### Implementation Details\n📋 **[Complete Implementation Summary](https://github.com/qiuhaotc/WebSSH/blob/master/docs/implementation-summary.md)** - Detailed technical documentation of all changes, features, and architecture decisions made during development\n\n## Deployment Via Docker\n\nRunning your server at port 8070, config the password \"your_password\" to your own.\n\n```bash\ndocker pull qiuhaotc/webssh\ndocker run -d --name webssh -p 8070:8080 -e ShellConfiguration__Users__0__Password=\"your_password\" --restart=always qiuhaotc/webssh\n```\n\n## Misc\n\n| Status            |                                                             Value                                                              |\n| :---------------- | :----------------------------------------------------------------------------------------------------------------------------: |\n| Stars             |              [![Stars](https://img.shields.io/github/stars/qiuhaotc/WebSSH)](https://github.com/qiuhaotc/WebSSH)               |\n| Forks             |              [![Forks](https://img.shields.io/github/forks/qiuhaotc/WebSSH)](https://github.com/qiuhaotc/WebSSH)               |\n| License           |            [![License](https://img.shields.io/github/license/qiuhaotc/WebSSH)](https://github.com/qiuhaotc/WebSSH)             |\n| Issues            |             [![Issues](https://img.shields.io/github/issues/qiuhaotc/WebSSH)](https://github.com/qiuhaotc/WebSSH)              |\n| Docker Pulls      |       [![Downloads](https://img.shields.io/docker/pulls/qiuhaotc/webssh.svg)](https://hub.docker.com/r/qiuhaotc/webssh)        |\n| Release Downloads | [![Downloads](https://img.shields.io/github/downloads/qiuhaotc/WebSSH/total.svg)](https://github.com/qiuhaotc/WebSSH/releases) |\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fqiuhaotc%2Fwebssh","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fqiuhaotc%2Fwebssh","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fqiuhaotc%2Fwebssh/lists"}