sshift · SSH CLI with jump‑server connections and password storage
Period —
At Biztalk I connected to more than 50 servers over SSH for patch work. Going through the jump server every time was tedious, so I put jump‑server connections and encrypted password storage into one CLI.
Jump‑server SSH to 50+ servers with one command
- Interactive server picker, direct connection by ID or name, and remote commands
- Add, edit, delete and list servers and jump relations
- Password and key authentication combinations for jump and target servers
- Encrypted password storage with an optional custom key
- JSON export and import of servers and jump relations
- Install through Homebrew, an install script or release binaries
Jump relations that loop
- Problem
- Adding jump relations freely could create a loop where A goes through B and B goes back through A.
- Solution
- Before adding a relation, a depth‑first search checks for a path from the target back to the source, and the relation is rejected if one exists. Saved jump relations never contain a loop.
A changed format for jump relations
- Problem
- After jump relations moved to a graph format, server lists made by earlier versions might not load.
- Solution
- If the graph format cannot be read, sshift reads the old relation array and converts it into a graph. Users do not have to rebuild their server lists.
Different authentication per server
- Problem
- At Biztalk, patching more than 50 servers meant going through a jump server for every connection. The jump server and the target often used different authentication, such as a password on one and a key on the other.
- Solution
- sshift builds the command from OpenSSH ProxyJump, ProxyCommand and sshpass depending on the password and key combination.
Passwords stored in plain text
- Problem
- Storing passwords as‑is in the server list exposed them to anyone who opened the file.
- Solution
- Passwords are encrypted with AES‑CTR and a random IV, and the config files are readable only by their owner. Opening the server list file shows passwords only as ciphertext.