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?

  • Atemu@lemmy.ml
    link
    fedilink
    arrow-up
    19
    ·
    1 year ago

    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.

    • some_guy@lemmy.sdf.org
      link
      fedilink
      arrow-up
      1
      ·
      1 year ago

      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
      
      
      • Atemu@lemmy.ml
        link
        fedilink
        arrow-up
        1
        ·
        1 year ago

        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.

        • some_guy@lemmy.sdf.org
          link
          fedilink
          arrow-up
          1
          ·
          1 year ago

          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
          
  • restlessyet@discuss.tchncs.de
    link
    fedilink
    arrow-up
    7
    ·
    1 year ago

    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.

    • Toribor@corndog.social
      link
      fedilink
      English
      arrow-up
      2
      ·
      1 year ago

      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.

  • S410@kbin.social
    link
    fedilink
    arrow-up
    7
    ·
    1 year ago

    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.

    • mFat@lemdro.idOP
      link
      fedilink
      English
      arrow-up
      2
      ·
      1 year ago

      I like this approach. Had never heard of those solutions. Thanks!

  • chayleaf@lemmy.ml
    link
    fedilink
    arrow-up
    4
    ·
    1 year ago

    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

  • Coelacanthus@lemmy.kde.social
    link
    fedilink
    arrow-up
    2
    ·
    1 year ago

    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.

  • dinckel@lemmy.world
    link
    fedilink
    arrow-up
    1
    ·
    1 year ago

    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

  • tvcvt@lemmy.ml
    link
    fedilink
    arrow-up
    1
    ·
    1 year ago

    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.

  • Pantherina@feddit.de
    link
    fedilink
    arrow-up
    1
    ·
    1 year ago

    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

  • bloopernova@programming.dev
    link
    fedilink
    English
    arrow-up
    1
    ·
    edit-2
    1 year ago

    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.