Passwordless SSH setup and ssh-copy-id alternative for Raspberry Pi, NVIDIA Jetson or any Linux device
Project description
ssh-keyup
Set up passwordless SSH on Raspberry Pi, NVIDIA Jetson or any Linux device in one command.
Tired of juggling ssh-keygen, ssh-copy-id (missing on Windows) and ~/.ssh/config edits every time you set up a new device?
ssh-keyup handles all three in a single interactive session.
Quickstart
Install globally with pip:
pip install ssh-keyup
ssh-keyup # ready to use anywhere
[!TIP] If
ssh-keyupis missing or runs an old version after install, the new script sits in a folder outside PATH (pip warns about this). Add that folder to PATH or use pipx:pipx install ssh-keyup.
Or run directly without installing:
git clone https://github.com/Kurokesu/ssh-keyup.git
cd ssh-keyup
python ssh_keyup.py # Windows
python3 ssh_keyup.py # Linux
Follow the prompts, enter the remote password once and you're done.
SSH from terminal:
ssh mypi # no password, ever again
Or open VSCode Remote - SSH, your ~/.ssh/config is already set up. Press Ctrl+Shift+P, select Remote-SSH: Connect to Host, pick your alias and get a full IDE on your remote device, no password:
Skip the prompts by passing arguments:
ssh-keyup pi@192.168.1.23 mypi # user, host and alias in one go
Or configure a whole fleet:
for host in 192.168.1.10 192.168.1.11 192.168.1.12; do
ssh-keyup pi@$host
done
Flags (--host, --user, --alias) work too, see ssh-keyup --help.
List or remove entries ssh-keyup manages:
ssh-keyup --list
ssh-keyup --remove mypi # deletes its key pair too
Why?
# without ssh-keyup (repeat for every new device)
ssh-keygen -t ed25519 -N "" -f ~/.ssh/id_ed25519_rpi5
scp ~/.ssh/id_ed25519_rpi5.pub trinity@192.168.1.23:~/
ssh trinity@192.168.1.23 "mkdir -p ~/.ssh && chmod 700 ~/.ssh"
ssh trinity@192.168.1.23 "cat ~/id_ed25519_rpi5.pub >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys && rm ~/id_ed25519_rpi5.pub"
nano ~/.ssh/config # add Host entry manually
...
# with ssh-keyup
ssh-keyup
Prerequisites
Python 3.8+ and OpenSSH tools (ssh, ssh-keygen) must be in PATH.
- Windows 10/11: Install Python from python.org or the Microsoft Store. OpenSSH Client is included via Settings > Optional Features or ships with Git for Windows.
- Linux:
sudo apt install python3 openssh-client(usually pre-installed).
Features
- Generates a per-host Ed25519 key pair (
~/.ssh/id_ed25519_<alias>) - Deploys public key to remote host in a single SSH session, only one password prompt
- Never touches your password.
ssh-keyuponly pipes the public key and SSH handles password authentication directly through its own terminal - Adds a named entry to
~/.ssh/config, works instantly withssh <alias>and VSCode Remote SSH - Detects and recovers from host key mismatches (common after reflashing)
- Handles re-runs gracefully: reuses existing keys or offers regeneration, detects duplicate config entries
- Works with any device reachable over SSH: Raspberry Pi, NVIDIA Jetson, Orange Pi, VMs, servers
- Zero Python dependencies, standard library only. Uses system OpenSSH (
ssh,ssh-keygen) - Installs via
pipor runs as a single script
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ssh_keyup-1.1.1.tar.gz.
File metadata
- Download URL: ssh_keyup-1.1.1.tar.gz
- Upload date:
- Size: 23.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
36238d8dfa53b8a1c70257c83e80bc6bdff306bc96e34bb3a4c51e64390ea30a
|
|
| MD5 |
21086dea0b6896a0cf743ea87315ea0e
|
|
| BLAKE2b-256 |
681d059ba8308641e25fe233f6976bb51c18eac8b3e0db17e3f03f8c19562308
|
Provenance
The following attestation bundles were made for ssh_keyup-1.1.1.tar.gz:
Publisher:
release.yml on Kurokesu/ssh-keyup
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ssh_keyup-1.1.1.tar.gz -
Subject digest:
36238d8dfa53b8a1c70257c83e80bc6bdff306bc96e34bb3a4c51e64390ea30a - Sigstore transparency entry: 2228133888
- Sigstore integration time:
-
Permalink:
Kurokesu/ssh-keyup@8c8ac1ca8353c606e786e538631bf20903cb186e -
Branch / Tag:
refs/tags/v1.1.1 - Owner: https://github.com/Kurokesu
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@8c8ac1ca8353c606e786e538631bf20903cb186e -
Trigger Event:
push
-
Statement type:
File details
Details for the file ssh_keyup-1.1.1-py3-none-any.whl.
File metadata
- Download URL: ssh_keyup-1.1.1-py3-none-any.whl
- Upload date:
- Size: 24.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dd4e9133dbfca189051c9499564de72151031a0ec2c0acb8c5b63b3c1f0ed2ff
|
|
| MD5 |
66eebe162aa174dd442c44dc2eee8a5c
|
|
| BLAKE2b-256 |
f3e15b2b1982bdddd77c68832fbc09dfdf28edefd2e3b28a608b6fa0251098b5
|
Provenance
The following attestation bundles were made for ssh_keyup-1.1.1-py3-none-any.whl:
Publisher:
release.yml on Kurokesu/ssh-keyup
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ssh_keyup-1.1.1-py3-none-any.whl -
Subject digest:
dd4e9133dbfca189051c9499564de72151031a0ec2c0acb8c5b63b3c1f0ed2ff - Sigstore transparency entry: 2228134046
- Sigstore integration time:
-
Permalink:
Kurokesu/ssh-keyup@8c8ac1ca8353c606e786e538631bf20903cb186e -
Branch / Tag:
refs/tags/v1.1.1 - Owner: https://github.com/Kurokesu
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@8c8ac1ca8353c606e786e538631bf20903cb186e -
Trigger Event:
push
-
Statement type: