{"id":13790086,"url":"https://github.com/bwhaley/ssmsh","last_synced_at":"2026-01-12T07:54:34.284Z","repository":{"id":43812366,"uuid":"107459865","full_name":"bwhaley/ssmsh","owner":"bwhaley","description":"A shell for the EC2 Parameter Store","archived":false,"fork":false,"pushed_at":"2024-02-14T19:13:38.000Z","size":16135,"stargazers_count":298,"open_issues_count":1,"forks_count":14,"subscribers_count":20,"default_branch":"master","last_synced_at":"2025-03-30T15:09:18.368Z","etag":null,"topics":["aws"],"latest_commit_sha":null,"homepage":null,"language":"Go","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/bwhaley.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":"2017-10-18T20:33:50.000Z","updated_at":"2024-12-31T19:35:46.000Z","dependencies_parsed_at":"2024-06-20T01:29:42.649Z","dependency_job_id":"6fdf726c-3ace-47ef-92fd-2520d01faa77","html_url":"https://github.com/bwhaley/ssmsh","commit_stats":null,"previous_names":["kountable/pssh","kountable/ssmsh"],"tags_count":24,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bwhaley%2Fssmsh","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bwhaley%2Fssmsh/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bwhaley%2Fssmsh/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bwhaley%2Fssmsh/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bwhaley","download_url":"https://codeload.github.com/bwhaley/ssmsh/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247517914,"owners_count":20951719,"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":["aws"],"created_at":"2024-08-03T22:00:36.828Z","updated_at":"2026-01-12T07:54:34.278Z","avatar_url":"https://github.com/bwhaley.png","language":"Go","funding_links":[],"categories":["Go","Tools"],"sub_categories":["CLI"],"readme":"# ssmsh\nssmsh is an interactive shell for the EC2 Parameter Store. Features:\n* Interact with the parameter store hierarchy using familiar commands like cd, ls, cp, mv, and rm\n* Supports relative paths and shorthand (`..`) syntax\n* Operate on parameters between regions\n* Recursively list, copy, and remove parameters\n* Get parameter history\n* Create new parameters using put\n* Advanced parameters (with policies)\n* Supports emacs-style command shell navigation hotkeys\n* Submit batch commands with the `-file` flag\n* Inline commands\n\n## Installation\n\n### Binaries\n\nDownload binaries for MacOS, Linux, or Windows from the latest release [here](https://github.com/bwhaley/ssmsh/releases).\n\n### Homebrew\n\nThere is a Homebrew tap published to this repo, for installation on both MacOS and Linux. Add the tap and install with:\n\n```bash\nbrew tap bwhaley/ssmsh https://github.com/bwhaley/ssmsh\nbrew install ssmsh\n```\n\n### Nix\n\nThere is also [a Nix package](https://search.nixos.org/packages?channel=unstable\u0026show=ssmsh\u0026query=ssmsh) available for MacOS and Linux:\n\n```bash\nnix-env -i ssmsh\n```\n\n## Configuration\n\nSet up [AWS credentials](http://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html#specifying-credentials).\n\nYou can set up a `.ssmshrc` to configure `ssmsh`. By default, `ssmsh` will load `~/.ssmshrc` if it exists. Use the `-config` argument to set a different path.\n\n```bash\n[default]\ntype=SecureString\noverwrite=true\ndecrypt=true\nprofile=my-profile\nregion=us-east-1\nkey=3example-89a6-4880-b544-73ad3db2ff3b\noutput=json\n```\n\nA few notes on configuration:\n* When setting the region, the `AWS_REGION` env var takes top priority, followed by the setting in `.ssmshrc`, followed by the value set in the AWS profile (if configured)\n* When setting the profile, the `AWS_PROFILE` env var takes top priority, followed by the setting in `.ssmshrc`\n* If you set a KMS key, it will only work in the region where that key is located. You can use the `key` command while in the shell to change the key.\n* If the configuration file has `output=json`, the results of the `get` and `history` commands will be printed in JSON. The fields of the JSON results will be the same as in the respective Go structs. See the [`Parameter`](https://docs.aws.amazon.com/sdk-for-go/api/service/ssm/#Parameter) and [`ParameterHistory`](https://docs.aws.amazon.com/sdk-for-go/api/service/ssm/#ParameterHistory) docs.\n\n## Usage\n### Help\n```bash\n/\u003e help\n\nCommands:\ncd           change your relative location within the parameter store\nclear        clear the screen\ncp           copy source to dest\ndecrypt      toggle parameter decryption\nexit         exit the program\nget          get parameters\nhelp         display help\nhistory      get parameter history\nkey          set the KMS key\nls           list parameters\nmv           move parameters\npolicy       create named parameter policy\nprofile      switch to a different AWS IAM profile\nput          set parameter\nregion       change region\nrm           remove parameters\n```\n\n### List contents of a path\nNote: Listing a large number of parameters may take a long time because the maximum number of results per API call is 10. Press ^C to interrupt if a listing is taking too long. Example usage:\n```bash\n/\u003e ls\ndev/\n/\u003e ls -r\n/dev/app/url\n/dev/db/password\n/dev/db/username\n/\u003e ls /dev/app\nurl\n/\u003e\n```\n\n### Change dir and list from current working dir\n```bash\n/\u003e cd /dev\n/dev\u003e ls\napp/\ndb/\n/dev\u003e\n```\n\n### Get a parameter\n```bash\n/\u003e get /dev/db/username\n[{\n  ARN: \"arn:aws:ssm:us-east-1:012345678901:parameter/dev/db/username\",\n  LastModifiedDate: 2019-09-29 23:22:19 +0000 UTC,\n  Name: \"/dev/db/username\",\n  Type: \"SecureString\",\n  Value: \"foo\",\n  Version: 1\n}]\n/\u003e cd /dev/db\n/dev/db\u003e get ../app/url\n[{\n  ARN: \"arn:aws:ssm:us-east-1:318677964956:parameter/dev/app/url\",\n  LastModifiedDate: 2019-09-29 23:22:49 +0000 UTC,\n  Name: \"/dev/app/url\",\n  Type: \"SecureString\",\n  Value: \"https://www.example.com\",\n  Version: 1\n}]\n/dev/db\u003e\n```\n\n### Toggle decryption for SecureString parameters\n```bash\n/\u003e decrypt\nDecrypt is false\n/\u003e decrypt true\nDecrypt is true\n/\u003e\n```\n\n### Get parameter history\n```bash\n/\u003e history /dev/app/url\n[{\n  KeyId: \"alias/aws/ssm\",\n  Labels: [],\n  LastModifiedDate: 2019-09-29 23:22:49 +0000 UTC,\n  LastModifiedUser: \"arn:aws:iam::318677964956:root\",\n  Name: \"/dev/app/url\",\n  Policies: [],\n  Tier: \"Standard\",\n  Type: \"SecureString\",\n  Value: \"https://www.example.com\",\n  Version: 1\n}]\n```\n\n### Copy a parameter\n```bash\n/\u003e cp /dev/app/url /test/app/url\n/\u003e ls -r /dev/app /test/app\n/dev/app:\n/dev/app/url\n/test/app:\n/test/app/url\n```\n\n### Copy an entire hierarchy\n```bash\n/\u003e cp -r /dev /test\n/\u003e ls -r /test\n/test/app/url\n/test/db/password\n/test/db/username\n```\n\n### Remove parameters\n```bash\n/\u003e rm /test/app/url\n/\u003e ls -r /test\n/test/db/password\n/test/db/username\n/\u003e rm -r /test\n/\u003e ls -r /test\n/\u003e\n```\n\n### Put new parameters\n```bash\nMultiline:\n/\u003e put\nInput options. End with a blank line.\n... name=/dev/app/domain\n... value=\"www.example.com\"\n... type=String\n... description=\"The domain of the app in dev\"\n...\n/\u003e\n```\nSingle line version:\n\n```bash\n/\u003e put name=/dev/app/domain value=\"www.example.com\" type=String description=\"The domain of the app in dev\"\n```\n\nPut with a value containing line breaks:\n\n```\n/\u003eput name=/secrets/key/private type=SecureString value=\"-----BEGIN RSA PRIVATE KEY-----\\\n... data\\\n... -----END RSA PRIVATE KEY-----\"\nPut /secrets/key/private version 1\n```\n\n### Advanced parameters with policies\nUse [parameter policies](https://docs.aws.amazon.com/systems-manager/latest/userguide/parameter-store-policies.html) to do things like expire (automatically delete) parameters at a specified time:\n```bash\n/\u003e policy urlExpiration Expiration(Timestamp=2013-03-31T21:00:00.000Z)\n/\u003e policy ReminderPolicy ExpirationNotification(Before=30,Unit=days) NoChangeNotification(After=7,Unit=days)\n/\u003e put name=/dev/app/url value=\"www.example.com\" type=String policies=[urlExpiration,ReminderPolicy]\n```\n\n### Switch AWS profile\nSwitches to another profile as configured in `~/.aws/config`.\n```bash\n/\u003e profile\ndefault\n/\u003e profile project1\n/\u003e profile\nproject1\n```\n\n### Change active region\n```bash\n/\u003e region eu-central-1\n/\u003e region\neu-central-1\n/\u003e\n```\n\n### Operate on other regions\nA few examples of working with regions.\n```bash\n/\u003e put region=eu-central-1  name=/dev/app/domain value=\"www.example.com\" type=String description=\"The domain of the app in dev\"\n/\u003e cp -r us-east-1:/dev us-west-2:/dev\n/\u003e ls -r us-west-2:/dev\n/\u003e region us-east-2\n/\u003e get us-west-2:/dev/db/username us-east-1:/dev/db/password\n```\n\n###  Read commands in batches\n```bash\n$ cat \u003c\u003c EOF \u003e commands.txt\nput name=/dev/app/domain value=\"www.example.com\" type=String description=\"The domain of the app in dev\"\nrm /dev/app/domain\ncp -r /dev /test\nEOF\n$ ssmsh -file commands.txt\n$ cat commands.txt | ssmsh -file -  # Read commands from STDIN\n```\n\n###  Inline commands\n```\n$ ssmsh put name=/dev/app/domain value=\"www.example.com\" type=String description=\"The domain of the app in dev\"\n```\n\n## todo (maybe)\n* [ ] Flexible and improved output formats\n* [ ] Release via homebrew\n* [ ] Copy between accounts using profiles\n* [ ] Find parameter\n* [ ] Integration w/ CloudWatch Events for scheduled parameter updates\n* [ ] Export/import\n* [ ] Support globbing and/or regex\n* [ ] In memory parameter cache\n* [ ] Read parameters as local env variables\n\n\n## License\nMIT\n\n## Contributing/compiling\n1. Ensure you have at least go v1.17\n```\n$ go version\ngo version go1.17.6 darwin/arm64\n```\n2. Ensure your `$GOPATH` exists and is in your `$PATH`\n```\nexport GOPATH=$HOME/go\nexport PATH=$PATH:$GOROOT/bin:$GOPATH/bin\n```\n3. Run `go get github.com/bwhaley/ssmsh`\n4. Run `cd $GOPATH/src/github.com/bwhaley/ssmsh \u0026\u0026 make` to build and install the binary to `$GOPATH/bin/ssmsh`\n\n\n## Related tools\nTool | Description\n---- | -----------\n[Chamber](https://github.com/segmentio/chamber) | A tool for managing secrets\n[Parameter Store Manager](https://github.com/smblee/parameter-store-manager) | A GUI for working with the Parameter Store\n[ssmple](https://github.com/adamcin/ssmple) | Serialize parameter store to properties\n\n## Credits\nLibrary | Use\n------- | -----\n[abiosoft/ishell](https://github.com/abiosoft/ishell) | The interactive shell for golang\n[aws-sdk-go](https://github.com/aws/aws-sdk-go) | The AWS SDK for Go\n[mattn/go-shellwords](github.com/mattn/go-shellwords) | Parsing for the shell made easy\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbwhaley%2Fssmsh","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbwhaley%2Fssmsh","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbwhaley%2Fssmsh/lists"}