{"id":16665043,"url":"https://github.com/alebeck/boring","last_synced_at":"2025-10-21T04:40:21.596Z","repository":{"id":257813219,"uuid":"860916807","full_name":"alebeck/boring","owner":"alebeck","description":"The `boring`  SSH tunnel manager","archived":false,"fork":false,"pushed_at":"2024-10-21T20:18:45.000Z","size":2912,"stargazers_count":637,"open_issues_count":6,"forks_count":19,"subscribers_count":4,"default_branch":"main","last_synced_at":"2024-10-23T04:57:28.318Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/alebeck.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":"2024-09-21T14:09:03.000Z","updated_at":"2024-10-23T03:06:55.000Z","dependencies_parsed_at":null,"dependency_job_id":"f09ffc5f-c9d0-471a-b711-d6d520a16502","html_url":"https://github.com/alebeck/boring","commit_stats":null,"previous_names":["alebeck/boring"],"tags_count":9,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alebeck%2Fboring","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alebeck%2Fboring/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alebeck%2Fboring/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alebeck%2Fboring/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/alebeck","download_url":"https://codeload.github.com/alebeck/boring/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":239011351,"owners_count":19567649,"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":[],"created_at":"2024-10-12T11:01:29.694Z","updated_at":"2025-10-21T04:40:21.584Z","avatar_url":"https://github.com/alebeck.png","language":"Go","readme":"\u003cdiv align=\"center\"\u003e\n\n\u003ch1\u003eThe \u003ccode\u003eboring\u003c/code\u003e tunnel manager\u003c/h1\u003e\n\n\u003cimg src=\"assets/gopher.png\" width=\"200\"\u003e\n\nA simple command line SSH tunnel manager that just works\n\n[![GitHub Actions Workflow Status](https://img.shields.io/github/actions/workflow/status/alebeck/boring/test_and_cover.yml?branch=main\u0026style=flat\u0026logo=github\u0026label=CI)](https://github.com/alebeck/boring/actions/workflows/test_and_cover.yml)\n[![GitHub Release](https://img.shields.io/github/v/release/alebeck/boring?color=orange)](https://github.com/alebeck/boring/releases/latest)\n[![Go Report Card](https://goreportcard.com/badge/github.com/alebeck/boring)](https://goreportcard.com/report/github.com/alebeck/boring)\n![Static Badge](https://img.shields.io/badge/license-MIT-blue?)\n\nGet it: `brew install boring`\n\n\u003c/div\u003e\n\n## Demo\n![Screenshot](./assets/dark.gif)\n\n## Features\n\n* Ultra lightweight and fast\n* Local, remote and dynamic (SOCKS5) port forwarding\n* Works with SSH config and `ssh-agent`\n* Supports Unix sockets\n* Automatic re-connection and keep-alives\n* Human-friendly TOML configuration\n* Cross-platform support\n* Smart shell completions\n\n## Usage\n\n```\nUsage:\n  boring list, l                List all tunnels\n  boring open, o (-a | \u003cpatterns\u003e...)\n    \u003cpatterns\u003e...               Open tunnels matching any glob pattern\n    -a, --all                   Open all tunnels\n  boring close, c               Close tunnels (same options as 'open')\n  boring edit, e                Edit the configuration file\n  boring version, v             Show the version number\n```\n\n## Configuration\n\nBy default, `boring` reads its configuration from `~/.boring.toml` on macOS and Windows, and from `$XDG_CONFIG_HOME/boring/.boring.toml` on Linux. If `$XDG_CONFIG_HOME` is not set, it defaults to `~/.config`. The location of the config file can be overriden by setting `$BORING_CONFIG`. The config is a simple TOML file describing your tunnels:\n\n```toml\n# simple tunnel\n[[tunnels]]\nname = \"dev\"\nlocal = \"9000\"\nremote = \"localhost:9000\"\nhost = \"dev-server\"  # automatically matches host against SSH config\n\n# example of an explicit host (no SSH config)\n[[tunnels]]\nname = \"prod\"\nlocal = \"5001\"\nremote = \"localhost:5001\"\nhost = \"prod.example.com\"\nuser = \"root\"\nidentity = \"~/.ssh/id_prod\"  # will try default ones if not set\n\n# ... more tunnels\n```\n\nCurrently, supported options at tunnel level are:\n\n| **Option**    | **Description**                                                                                                     |\n|---------------|---------------------------------------------------------------------------------------------------------------------|\n| `name`        | Alias for the tunnel. **Required.**                                                                                 |\n| `local`       | Local address. Can be a `\"$host:$port\"` network address or a Unix socket. Can be abbreviated as `\"$port\"` in local and socks modes. **Required** in local, remote and socks modes. |\n| `remote`      | Remote address. As above, but can be abbreviated in remote and socks-remote modes. **Required** in local, remote and socks-remote modes. |\n| `host`        | Either a host alias that matches SSH configs or the actual hostname. **Required.**                            |\n| `mode`        | Mode of the tunnel. Can be either `\"local\"`, `\"remote\"`, `\"socks\"` or `\"socks-remote\"`. Default is `\"local\"`.       |\n| `user`        | SSH user. If not set, tries to read it from SSH config, defaulting to `$USER`.                                       |\n| `identity`    | SSH identity file. If not set, tries to read it from SSH config and `ssh-agent`, defaulting to standard identity files.     |\n| `port`        | SSH port. If not set, tries to read it from SSH config, defaulting to `22`.                                          |\n\nOptions that can be provided at global and tunnel level (tunnel level takes precedence):\n\n| **Option**    | **Description**                                                                                                     |\n|---------------|---------------------------------------------------------------------------------------------------------------------|\n| `keep_alive`  | Keep-alive interval **in seconds**. Default: `120` (2 minutes).                                                                                 |\n\n## Installation\n\n### Homebrew\n\n```sh\nbrew install boring\n```\n\n### Pre-built\n\nGet one of the pre-built binaries from the [releases page](https://github.com/alebeck/boring/releases). Then move the binary to a location in your `$PATH`.\n\n### Build yourself\n\n```sh\ngit clone https://github.com/alebeck/boring \u0026\u0026 cd boring\nmake\n```\n\nThen move the binary in `dist` to a location in your `$PATH`.\n\n\u003cdetails\u003e\n  \u003csummary\u003eNote for Windows users\u003c/summary\u003e\n  Windows is fully supported since release 0.6.0. Users currently have to build from source, which is very easy. Make sure Go \u003e= 1.23.0 is installed and then compile via\n\n  ```batch\n  git clone https://github.com/alebeck/boring \u0026\u0026 cd boring\n  .\\build_win.bat\n  ```\n\n  Then, move the executable to a location in your `%PATH%`.\n\u003c/details\u003e\n\n### Shell completion\n\nShell completion scripts are available for `bash`, `zsh`, and `fish`.\n\nIf `boring` was installed via Homebrew, and you have Homebrew completions enabled, nothing needs to be done.\n\nOtherwise, install completions by adding the following to your shell's config file:\n\n#### Bash\n\n```sh\neval \"$(boring --shell bash)\"\n```\n\n#### Zsh\n\n```sh\nsource \u003c(boring --shell zsh)\n```\n\n#### Fish\n\n```sh\nboring --shell fish | source\n```\n## Further Links\n* pkg.go.dev: https://pkg.go.dev/github.com/alebeck/boring\n* Coveralls: https://coveralls.io/github/alebeck/boring?branch=main\n\n## Credits\nGo gopher logo by Renee French.\n","funding_links":[],"categories":["Utilities","Go","Operating Systems","🌐 Networking","公用事业公司"],"sub_categories":["Utility/Miscellaneous","Linux","☸️ Kubernetes","实用程序/Miscellaneous"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falebeck%2Fboring","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Falebeck%2Fboring","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falebeck%2Fboring/lists"}