Release Notes
Added
- Hosts that share one login password can now share one stored secret. Name a credential, point
hosts at it, and rotating is a single write instead of one per host:
sshelf credentials add corp-ldap,sshelf credentials bind corp-ldap web-01 web-02,
printf %s "$PASS" | sshelf set-password --credential corp-ldap.hosts.tomlholds only the
name; the secret still lives in the keyring or the vault.sshelf credentialslists who uses
what and whether a secret is actually stored. Ctrl-smarks hosts in the list andCtrl-ksets a password for all of them, or binds them to
a shared credential, or unbinds them. With nothing marked it acts on whatever the filter is
showing, sotag:prodthenCtrl-kcovers a group. Hosts that already have a secret are
skipped unless you turn replacing on withCtrl-r, and the counts are on screen. A bulk write
is not checked against the hosts (that would be one login each); a wrong one shows up on that
host's next connect, as it already did.sshelf <host> -- COMMAND ...runs one command on the host instead of opening a shell and
exits with the command's own status.-tasks for a pty. The command reaches only that
connect: it is never stored on the host, never seen by the transfer screen, the forward builder
orsshelf export.
Changed
sshelf set-password <host>on a host that uses a shared credential sets that credential, and
says how many hosts it just changed.- Deleting a host no longer deletes its stored secret when the host was reading from a shared
credential, since the other hosts on it still need the value. - A
hosts.tomlthat uses shared credentials declaresformat_version = 2. One that does not
keeps declaring1, so upgrading does not by itself produce a file an older sshelf refuses.
Fixed
sshelf sites --jsonworks. It has been documented since sites shipped but was rejected
unless you spelled outsshelf sites list --json. The same applies to the new
sshelf credentials --json.- A
hosts.tomldeclaring aformat_versionnewer than the running sshelf understands is now
refused with a message telling you to upgrade, instead of being parsed and then rewritten
without the parts it did not recognise. - The CLI paths that edit
hosts.tomlrefuse to save when another sshelf changed the file since
they read it, instead of replacing that change. An atomic write never corrupted the file, but
it could not prevent a lost update. sshelf set-passwordwith empty stdin prints its message again. It was swallowed to a bare
Error:because the text contains a|.
Install sshelf 0.16.0
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/max-rh/sshelf/releases/download/v0.16.0/sshelf-installer.sh | shInstall prebuilt binaries via Homebrew
brew install max-rh/tap/sshelfDownload sshelf 0.16.0
| File | Platform | Checksum |
|---|---|---|
| sshelf-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| sshelf-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| sshelf-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| sshelf-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |
Verifying GitHub Artifact Attestations
The artifacts in this release have attestations generated with GitHub Artifact Attestations. These can be verified by using the GitHub CLI:
gh attestation verify <file-path of downloaded artifact> --repo max-rh/sshelfYou can also download the attestation from GitHub and verify against that directly:
gh attestation verify <file-path of downloaded artifact> --bundle <file-path of downloaded attestation>