{"id":14008133,"url":"https://github.com/tbotnz/cisshgo","last_synced_at":"2026-03-15T05:47:52.205Z","repository":{"id":38939415,"uuid":"289388617","full_name":"tbotnz/cisshgo","owner":"tbotnz","description":"simple concurrent ssh server posing as cisco ios","archived":false,"fork":false,"pushed_at":"2024-03-04T16:12:05.000Z","size":2204,"stargazers_count":131,"open_issues_count":6,"forks_count":26,"subscribers_count":7,"default_branch":"master","last_synced_at":"2024-08-10T11:02:39.198Z","etag":null,"topics":["ansible","ci","cicd","cisco-ios","netdev","netdevops"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tbotnz.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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-22T00:11:04.000Z","updated_at":"2024-07-24T01:49:52.000Z","dependencies_parsed_at":"2024-06-20T06:08:26.115Z","dependency_job_id":null,"html_url":"https://github.com/tbotnz/cisshgo","commit_stats":null,"previous_names":["tbotnz/cisgo-ios"],"tags_count":6,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tbotnz%2Fcisshgo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tbotnz%2Fcisshgo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tbotnz%2Fcisshgo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tbotnz%2Fcisshgo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tbotnz","download_url":"https://codeload.github.com/tbotnz/cisshgo/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":227410461,"owners_count":17774755,"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":["ansible","ci","cicd","cisco-ios","netdev","netdevops"],"created_at":"2024-08-10T11:01:16.522Z","updated_at":"2026-03-15T05:47:52.197Z","avatar_url":"https://github.com/tbotnz.png","language":"Go","funding_links":[],"categories":["Go"],"sub_categories":[],"readme":"# cisshgo\n\nSimple, small, fast, concurrent SSH server to emulate network equipment (i.e. Cisco IOS) for testing purposes.\n\n[![CI](https://github.com/tbotnz/cisshgo/actions/workflows/test.yml/badge.svg)](https://github.com/tbotnz/cisshgo/actions/workflows/test.yml)\n[![coverage](https://raw.githubusercontent.com/tbotnz/cisshgo/badges/.badges/master/coverage.svg)](https://github.com/tbotnz/cisshgo/actions/workflows/test.yml)\n[![Go Report Card](https://goreportcard.com/badge/github.com/tbotnz/cisshgo)](https://goreportcard.com/report/github.com/tbotnz/cisshgo)\n[![Go Reference](https://pkg.go.dev/badge/github.com/tbotnz/cisshgo.svg)](https://pkg.go.dev/github.com/tbotnz/cisshgo)\n[![Release](https://img.shields.io/github/v/release/tbotnz/cisshgo)](https://github.com/tbotnz/cisshgo/releases)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\n## Quick Start\n\n### Using Pre-built Binaries\n\nDownload the latest release from [GitHub Releases](https://github.com/tbotnz/cisshgo/releases) and run:\n\n```bash\n./cisshgo\n```\n\n### Building from Source\n\n#### Quick Run\n\n```bash\ngo run cissh.go\n```\n\n#### Build and Run\n\n```bash\ngo build -o cisshgo cissh.go\n./cisshgo\n```\n\n### Using Docker\n\nPull and run the latest release:\n\n```bash\ndocker run -d -p 10000-10049:10000-10049 ghcr.io/tbotnz/cisshgo:latest\n```\n\nOr run with custom options:\n\n```bash\ndocker run -d -p 10000:10000 ghcr.io/tbotnz/cisshgo:latest --listeners 1 --starting-port 10000\n```\n\nOr build locally:\n\n```bash\ndocker build -t cisshgo .\ndocker run -d -p 10000-10049:10000-10049 cisshgo\n```\n\n### Using GoReleaser (for maintainers)\n\nBuild a local snapshot release:\n\n```bash\ngoreleaser release --snapshot --clean --skip=publish\n```\n\n## Releasing\n\nReleases are automated via GitHub Actions. To create a new release:\n\n1. Update the changelog and tag:\n\n   ```bash\n   git-cliff --tag v1.2.3 -o CHANGELOG.md\n   git add CHANGELOG.md\n   git commit -m \"docs: update changelog for v1.2.3\"\n   git tag -a v1.2.3 -m \"v1.2.3\"\n   git push origin master v1.2.3\n   ```\n\n2. GitHub Actions will automatically:\n   - Build binaries for all platforms (linux/darwin/windows, amd64/arm64)\n   - Create multi-arch Docker images and push to GitHub Container Registry (ghcr.io)\n   - Generate release notes from git-cliff\n   - Generate SBOMs for security compliance\n   - Create GitHub Release with binaries, archives, and checksums\n   - Build deb/rpm packages\n\n\u003e No additional secrets are required. Docker images are published to `ghcr.io` using the built-in `GITHUB_TOKEN`.\n\n## Connecting\n\nSSH into any of the open ports with `admin` as the password:\n\n```bash\nssh -p 10000 admin@localhost\n```\n\nDefault password: `admin`\n\n## Example Session\n\n```text\ntest_device#show version\nCisco IOS XE Software, Version 16.04.01\nCisco IOS Software [Everest], CSR1000V Software (X86_64_LINUX_IOSD-UNIVERSALK9-M), Version 16.4.1, RELEASE SOFTWARE (fc2)\nTechnical Support: http://www.cisco.com/techsupport\nCopyright (c) 1986-2016 by Cisco Systems, Inc.\nCompiled Sun 27-Nov-16 13:02 by mcpre\n...\nROM: IOS-XE ROMMON\n```\n\nAvailable commands:\n\n- `show version`\n- `show ip interface brief`\n- `show running-config`\n\nAdditional commands can be added by modifying `transcripts/transcript_map.yaml`.\n\n## Advanced Usage\n\n### Command Line Options\n\n```text\n  -l, --listeners=50           How many listeners to spawn ($CISSHGO_LISTENERS).\n  -p, --starting-port=10000    Starting port ($CISSHGO_STARTING_PORT).\n  -t, --transcript-map=\"transcripts/transcript_map.yaml\"\n                               Path to transcript map YAML file\n                               ($CISSHGO_TRANSCRIPT_MAP).\n  -P, --platform=\"csr1000v\"    Platform to use when no inventory is provided\n                               ($CISSHGO_PLATFORM).\n  -i, --inventory=STRING       Path to inventory YAML file ($CISSHGO_INVENTORY).\n```\n\n### Example: Single Listener\n\n```bash\n./cisshgo --listeners 1 --starting-port 10000\n```\n\n## Expanding Platform Support\n\ncisshgo is built with modularity in mind to support easy expansion or customization.\n\n### Customized Output in Command Transcripts\n\nTranscripts support Go templating. For example, in `show_version.txt`:\n\n```text\nROM: IOS-XE ROMMON\n{{.Hostname}} uptime is 4 hours, 55 minutes\nUptime for this control processor is 4 hours, 56 minutes\n```\n\nAvailable template variables from `fakedevices.FakeDevice`:\n\n```go\ntype FakeDevice struct {\n    Vendor            string            // Vendor of this fake device\n    Platform          string            // Platform of this fake device\n    Hostname          string            // Hostname of the fake device\n    Password          string            // Password of the fake device\n    SupportedCommands SupportedCommands // What commands this fake device supports\n    ContextSearch     map[string]string // The available CLI prompt/contexts on this fake device\n    ContextHierarchy  map[string]string // The hierarchy of the available contexts\n}\n```\n\n### Adding Additional Command Transcripts\n\n1. Create a plain text file in the appropriate `vendor/platform` folder\n2. Add an entry in `transcripts/transcript_map.yaml`:\n\n```yaml\n---\nplatforms:\n  - csr1000v:\n      command_transcripts:\n        \"my new fancy command\": \"transcripts/cisco/csr1000v/my_new_fancy_command.txt\"\n```\n\n### Adding Additional \"Cisco-style\" Platforms\n\nSupply additional device types and transcripts in `transcript_map.yaml`.\nThis works for devices with similar interaction patterns (e.g., `configure terminal` leading to `(config)#` mode).\n\n### Adding Additional Non-\"Cisco-style\" Platforms\n\n**NOTE:** This feature is not fully implemented yet!\n\nFor platforms with different interaction patterns (e.g., Juniper, F5):\n\n1. Implement a new handler module under `ssh_server/handlers`\n2. Add it to the device mapping in `cissh.go`\n\nThe handler controls SSH session emulation and provides conditional logic to simulate the device experience.\n\n## License\n\nMIT License - see [LICENSE](LICENSE) file for details.\n\n## Disclaimer\n\nCisco IOS is the property/trademark of Cisco.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftbotnz%2Fcisshgo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftbotnz%2Fcisshgo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftbotnz%2Fcisshgo/lists"}