How do you guys quickly sync your settings (especially bash aliases and ssh keys) across your machines?
Ideally i want a simple script to run on every new server I work with. Any suggestions?
I suggest you don’t sync SSH keys. That’s just increasing the blast radius of any one of those machines being compromised.
Exactly this. Don’t move private keys between machines. Generate them where you need them, it’s not like they cost anything
Right. Use some kind of centralized authentication like freeipa.
For bash aliases, I just pull down a .bashrc from github gists.
OP should just generate a unique SSH key per device (+ user).
Agreed. I’ve probably got 100 keys registered with GitHub and 98 of them the private key is long destroyed due to OS reinstalls or whatnot. Format machine, new key. New machine, new key.
Is the url is easy to rember?
I’m surprised no one mentioned ansible yet. It’s meant for this (and more).
By ssh keys I assume you’re talking about authorized_keys, not private keys. I agree with other posters that private keys should not be synced, just generate new ones and add them to the relevant servers authorized_keys with ansible.
If the keys are password protected… eh why not sync them.
Also ssh certificates are a thing, they make doing that kind of stuff way easier instead of updating known hosts and authorized keys all the time
Syncthing. If you want flatpak, syncthingy.
Its simply best, does all the annoying background things like webUI, machines, versioning, verifying etc. If you disable global discovery you can use it tough LAN only
Have you considered a shared folder with Syncthing?
That my solution. I have a ‘Sync’ folder on every device’s Home folder, and then I use some aliases to determine whether to grab the bash_aliases file or replace it:
- alias dba=‘diff -s ~/.bash_aliases ~/Sync/.bash_aliases’ # compare files
- alias s2ba=‘cp ~/Sync/.bash_aliases ~/’ # Push from Sync folder to current bash aliases
- alias ba2s=‘cp ~/.bash_aliases ~/Sync/’ # Push from current bash aliases to Sync folder
By far, the diff alias is the most used. It allows for a quick check on what is different between files w/o having to open them up
Git and GNU stow.
I love this solution, I’ve been using it for years. I had previously just been using the home directory is a git repo approach, and it never quite felt natural to me and came with quite a few annoyances. Adding stow to the mix was exactly what I needed.
This is the only answer for me. Bonus points if your .login file does a background git pull.
Ditto – I’ve been keeping a central to me git repo for my settings for years. Any new machine I’m on ‘git clone ; ./settings/setup.sh’, then my pull’d .profile does a git pull on login.
This looks popular: www.chezmoi.io
+1 this, it is amazing. The scripting features are the cherry on top.
I use a git repo combined with the basic install utility. Clone the repo, run the app installer, then run the install script. For symlinks I just use a zsh script.
Thanks that’s a good idea.
yadm
I use it with GitHub, works amazing on multiple boxes, OSX and Linux. For SSH keys, just use KeePassXC and SyncThing.
On my devices like PCs, laptops or phones, syncthing syncs all my .rc files, configs, keys, etc.
For things like servers, routers, etc. I rely on OpenSSH’s ability to send over environmental variables to send my aliases and functions.
On the remote I have
[ -n "$SSH_CONNECTION" ] && eval "$(echo "$LC_RC" | { { base64 -d || openssl base64 -d; } | gzip -d; } 2>/dev/null)"
in whatever is loaded when I connect (.bashrc, usually)
On the local machine
alias ssh="$([ -z "$SSH_CONNECTION" ] && echo 'LC_RC=$(gzip < ~/.rc | base64 -w 0)') ssh'
That’s not the best way to do that by any means (it doesn’t work with dropbear, for example), but for cases like that I have other non-generic, one-off solutions.
I keep my dotfiles in a got repo and just do a
git pull
your update them. That could definitely be a cron job if you needed.SSH keys are a little trickier. I’d like to tell you I have a unique key for each of my desktop machines since that would be best practice, but that’s not the case. Instead I have a Syncthing shared folder. When I get around to cleaning that up, I’ll probably do just that and keep an
authorize_keys
andknown_hosts
file in git so I can pull them to needed hosts and a cron job to keep them updated.Dotfiles go in git, SSH keys are state.
I’m looking to migrate to home-manager though because I use Nix on all my devices anyways.
My solution is not ideal:
I created a directory, called ~/config_sync. I create sym links for config files, like ~/.bashtc to ~/config_sync/bashrc
However, I need to record the sym links I’ve created, and repeat this process on new machines
Look into using GNU stow! It’s exactly what you’re doing but it creates the symlinks for you.
1password does this for me, when it comes to ssh keys, and it’s great. All I have to do on a new machine is setup the ssh-agent, which is also practically preconfigured. The actual key never leaves the password manager
deleted by creator