{"id":34091775,"url":"https://github.com/ezh/cloudselect","last_synced_at":"2026-04-08T15:31:18.267Z","repository":{"id":48363128,"uuid":"225742111","full_name":"ezh/cloudselect","owner":"ezh","description":"FZF selector for cloud instances","archived":false,"fork":false,"pushed_at":"2023-05-15T20:51:49.000Z","size":1890,"stargazers_count":4,"open_issues_count":13,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-01-05T15:04:05.344Z","etag":null,"topics":["aws","cloud","fzf","hetzner","kubernetes","python3","shell","tmux"],"latest_commit_sha":null,"homepage":"https://cloudselect.readthedocs.io/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ezh.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-12-04T00:13:06.000Z","updated_at":"2021-07-13T00:07:33.000Z","dependencies_parsed_at":"2022-09-05T13:30:50.207Z","dependency_job_id":null,"html_url":"https://github.com/ezh/cloudselect","commit_stats":null,"previous_names":[],"tags_count":18,"template":false,"template_full_name":null,"purl":"pkg:github/ezh/cloudselect","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ezh%2Fcloudselect","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ezh%2Fcloudselect/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ezh%2Fcloudselect/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ezh%2Fcloudselect/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ezh","download_url":"https://codeload.github.com/ezh/cloudselect/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ezh%2Fcloudselect/sbom","scorecard":{"id":389183,"data":{"date":"2025-08-11","repo":{"name":"github.com/ezh/cloudselect","commit":"035702ef5532b0be6fbe2afa030c5cd5eaef9ed4"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.9,"checks":[{"name":"Code-Review","score":0,"reason":"Found 0/2 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":9,"reason":"1 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-jh85-wwv9-24hv"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 28 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-18T17:23:16.538Z","repository_id":48363128,"created_at":"2025-08-18T17:23:16.538Z","updated_at":"2025-08-18T17:23:16.538Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31562685,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-08T14:31:17.711Z","status":"ssl_error","status_checked_at":"2026-04-08T14:31:17.202Z","response_time":54,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["aws","cloud","fzf","hetzner","kubernetes","python3","shell","tmux"],"created_at":"2025-12-14T14:50:06.784Z","updated_at":"2026-04-08T15:31:18.254Z","avatar_url":"https://github.com/ezh.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"#### FZF Cloud Select\n\n[![Build Status](https://travis-ci.org/ezh/cloudselect.svg?branch=master)](https://travis-ci.org/ezh/cloudselect)\n[![codecov](https://codecov.io/gh/ezh/cloudselect/branch/master/graph/badge.svg)](https://codecov.io/gh/ezh/cloudselect)\n[![MIT License](https://img.shields.io/badge/license-MIT-007EC7.svg)](/LICENSE)\n[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/cloudselect)](https://pypi.org/project/cloudselect/)\n[![Codacy Badge](https://api.codacy.com/project/badge/Grade/124d1f6ec45e45deaf924e740670087f)](https://www.codacy.com/manual/ezh/cloudselect?utm_source=github.com\u0026utm_medium=referral\u0026utm_content=ezh/cloudselect\u0026utm_campaign=Badge_Grade)\n[![code style](https://img.shields.io/badge/code%20style-black-000000.svg)](https://black.readthedocs.io/en/stable)\n\nYou may find a documentation at the \u003ca href=\"https://cloudselect.readthedocs.io/\" target=\"_blank\"\u003eRead The Docs\u003c/a\u003e\n\n[![PyPI - The Latest Version](https://img.shields.io/pypi/v/cloudselect?label=the%20latest%20version\u0026style=for-the-badge)](https://pypi.org/project/cloudselect/)\n\n## Environments\n\n-   [Amazon Web Services (AWS)](https://aws.amazon.com/)\n-   [Hetzner cloud](https://www.hetzner.com/cloud)\n-   [Kubernetes](https://kubernetes.io/)\n-   Discovery results from a local command\n\n## Purpose\n\nWe should jump between nodes quickly, having a pack of cloud accounts. Each account could be in a different region. Some nodes are publicity available, some of them not. Dozen of nodes sit behind bastion hosts. And a few of them sit behind a group of jump points. And they all have different SSH keys.\n\nThere is a `~/.ssh/config`, but it is not enough because of the dynamic nature of the cloud. It is too clumsy and not suitable for cases when IP addresses are changing instantly, and instances are creating and destroying in minutes.\n\nI tried to structure that chaos with shell scripts, but the shell is not enough. I believe that tools like _C_/_C++_/_Java_/_Node.JS_/_Go_?/_Rust_ are too heavy for this case. Python is the exact thing. I like to have a dynamic and lightweight solution. Cloud Select is fast enough to go through thousands of nodes. Maybe if my scope will be higher, then I'll create something other.\n\nCloud Select is useful for diving inside geo-distributed onion enterprise environments with weird security settings.\n\n## Implementation\n\nCloudSelect retrieves node list from the cloud, passes that list to FZF, adds some useful information to selected nodes (like jump hosts, `sudo -i` command, etc...), and returns dictionary that could be used by other programs. CloudSelect is a team player in a shell environment. We can automatically open interactive SSH sessions in parallel and provide passwords to `sudo -i` under TMUX environment.\n\n## Demo\n\n[![demo](https://raw.githubusercontent.com/ezh/cloudselect/master/docs/demo/2019-12-11_23-04-56%20cloudselect%20demo.gif)](https://github.com/ezh/cloudselect/tree/master/docs/demo)\n\nThe tool is:\n\n1.  connecting to bastion host with public IP 54.171.154.230\n2.  using locally stored key on bastion because the usage of ssh-agent is restricted by security team ?lol? and sshd settings are `AllowTcpForwarding no`, `GatewayPorts no`\n3.  jumping to 4 EC2 web instances in development environment that located in private subnet 172.30.x.x\n4.  running `sudo -i` at startup\n5.  entering `sudo` password 12345678\n\n_And after that, we have four ready to use interactive sessions in our terminal..._\n\nYou may find a demo files in \u003ca href=\"https://github.com/ezh/cloudselect/tree/master/docs/demo\" target=\"_blank\"\u003edocs/demo\u003c/a\u003e directory.\n\n## Basic usage\n\n-   Connect to a single known_hosts server\n-   Connect to a single EC2 AWS instance\n\n## Advanced usage\n\n-   Connect to multiple known_hosts servers, run `sudo -i` command at startup and enter `sudo` password\n-   Connect to multiple EC2 AWS instances, run `sudo -i` command at startup and enter `sudo` password\n-   Connect to multiple EC2 AWS instances through a _bastion_ host, run `sudo -i` command at startup and enter `sudo` password\n\n## Features\n\n:rocket: We may use jump hosts even if jump host hasn't been configured to allow remote port forwarding and we have the following settings in sshd_config:\n\n```sh\nAllowTcpForwarding no\nGatewayPorts no\n```\n\n## Installation\n\nCloudSelect is on PyPi! You can install CloudSelect with a simple pip command:\n\n```sh\npip install cloudselect\n```\n\nAdd profile bash completion:\n\n```sh\ncomplete -C cloudselect_completer cloudselect\n```\n\nYou may copy suitable wrapper from [example](https://github.com/ezh/cloudselect/tree/master/example) directory.\n\n# License\n\n[MIT][mit] © [Alexey Aksenov][author] et [al][contributors]\n\n[mit]: https://opensource.org/licenses/MIT\n[author]: https://github.com/ezh\n[contributors]: https://github.com/ezh/cloudselect/graphs/contributors\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fezh%2Fcloudselect","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fezh%2Fcloudselect","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fezh%2Fcloudselect/lists"}