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.
From Wikipedia, the free encyclopedia
Linux is a family of open source Unix-like operating systems based on the Linux kernel, an operating system kernel first released on September 17, 1991 by Linus Torvalds. Linux is typically packaged in a Linux distribution (or distro for short).
Distributions include the Linux kernel and supporting system software and libraries, many of which are provided by the GNU Project. Many Linux distributions use the word "Linux" in their name, but the Free Software Foundation uses the name GNU/Linux to emphasize the importance of GNU software, causing some controversy.
Community icon by Alpár-Etele Méder, licensed under CC BY 3.0
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.
Home manager is great
I also have multiple versions of by bash_profile with syntax specific to the OS. It checks if we're on MacOS or Linux with a kernel check and then reads the appropriate ancillary bash_profile for that platform. Anything that can live in the main bash_profile with the same command on both platforms lives there and anything that needs to be system-specific is in the other one.
I have all my important functions as individual files that get loaded with the following:
function loadfuncs() {
local funcdir="$HOME/.dotfiles/functions/"
[ -e "${funcdir}".DS_Store ] && rm "$HOME/.dotfiles/functions/.DS_Store"
local n=0
for i in "${funcdir}"*; do
source "$(realpath $i)"
n=$(( n + 1 ))
done
}
loadfuncs
Interesting way to go about it. Though when I'm at the point where I need differences between linux and darwin, I'm probably going to do that at the home-manager level.
Just for fun, here's how I'm checking that (this was written in 2016 and may require adjusting as I haven't been keeping up on Linux for a while):
function oscheck() {
if [[ "$(uname -s)" == 'Darwin' ]]; then
# echo Darwin
osType=Darwin
return 0
elif
[[ "$(uname -s)" == 'Linux' ]]; then
# echo Linux
osType=Linux
grep CentOS /etc/os-release > /dev/null
if [[ "$?" == 0 ]]; then
# echo "CentOS"
export theDistro=CentOS
return 0
else
:
fi
grep Ubuntu /etc/os-release > /dev/null
if [[ "$?" == 0 ]]; then
export theDistro=Ubuntu
return 0
else
:
# echo "Not Ubuntu"
fi
printf " %s\n" "Error: osType tested true for Linux, but did not find CentOS or Ubuntu." ""
return 1
else
osType=Unknown
return 1
fi
}
oscheck
Checking for Ubuntu or CentOS is a tad limiting given the amount of distros there are ;)
Yeah, but those were the two I was using. I didn't mean to suggest that the code, as is, was correct for everyone. ;-)
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.
I use Ansible for this as well. It's great. I encrypt secrets with Ansible vault and then use it to set keys, permissions, config files, etc. across my various workstations. Makes setup and troubleshooting a breeze.
This looks popular: www.chezmoi.io
+1 this, it is amazing. The scripting features are the cherry on top.
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
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.
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.
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.
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:
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
I like this approach. Had never heard of those solutions. Thanks!
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.
ssh keys go into my keepass db, keepassxc imports them into gpg agent or ssh agent. Bash aliases and so on are in my dotfiles
yadm
Yet Another Stow-Based Dotfile Sync Manager
yas-bdsm
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
and known_hosts
file in git so I can pull them to needed hosts and a cron job to keep them updated.
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.
Use a git repo and stow
tool. For updating, you only need run git pull
(and stow
if you create config for a new software). If you modify some config, just git add && git commit && git push.
With this way, you can also record change history of your config.