dotfiles/.config/scripts/ssh.sh
2025-08-30 08:11:13 -05:00

91 lines
2.3 KiB
Bash
Executable file

#!/bin/bash
# Variables
YUBIKEY_ID_DIR="$HOME/.config/yubikey"
SSH_ID_RSA="$HOME/.ssh/id_rsa"
# Function to display an error message and exit
error_exit() {
echo "Error: $1" >&2
exit 1
}
# Find YubiKeys
yubikeys=$(ykman list)
if [[ -z "$yubikeys" ]]; then
error_exit "No YubiKeys found."
fi
# Select a YubiKey using wofi
selected=$(echo "$yubikeys" | wofi --dmenu -i)
if [[ -z "$selected" ]]; then
error_exit "No YubiKey selected."
fi
# Extract the YubiKey serial number
YUBIKEY_SERIAL=$(echo "$selected" | awk '{print $NF}')
if [[ -z "$YUBIKEY_SERIAL" ]]; then
error_exit "Failed to extract YubiKey serial number."
fi
# Remove existing symbolic link if it exists
if [ -L "$SSH_ID_RSA" ]; then
rm -f "$SSH_ID_RSA"
if [ $? -ne 0 ]; then
error_exit "Failed to remove existing symbolic link."
fi
fi
# Create the symbolic link
ln -s "$YUBIKEY_ID_DIR/id_$YUBIKEY_SERIAL" "$SSH_ID_RSA"
if [ $? -ne 0 ]; then
error_exit "Failed to create symbolic link."
fi
# Set correct permissions
chmod 600 "$SSH_ID_RSA"
if [ $? -ne 0 ]; then
error_exit "Failed to set permissions on symbolic link."
fi
# Stop the current ssh-agent
if [ -n "$SSH_AGENT_PID" ]; then
ssh-agent -k
if [ $? -ne 0 ]; then
echo "Failed to stop existing ssh-agent. Continuing..."
fi
unset SSH_AGENT_PID SSH_AUTH_SOCK
fi
# Start a new ssh-agent
eval $(ssh-agent -s)
if [ -z "$SSH_AGENT_PID" ]; then
error_exit "Failed to start ssh-agent."
fi
# Update tmux sessions if tmux is running
if tmux ls 2>/dev/null; then
tmux ls 2>/dev/null | cut -d ':' -f1 | while read -r session_name; do
tmux setenv -t "$session_name" SSH_AUTH_SOCK "$SSH_AUTH_SOCK"
tmux setenv -t "$session_name" SSH_AGENT_PID "$SSH_AGENT_PID"
tmux refresh-client -t "$session_name"
if [ $? -ne 0 ]; then
echo "Failed to update tmux session: $session_name. Continuing..."
else
echo "Updated tmux session: $session_name"
fi
done
fi
# Verify symbolic link creation
if [ -L "$SSH_ID_RSA" ]; then
echo "Symbolic link created successfully at $SSH_ID_RSA"
else
error_exit "Failed to create symbolic link at $SSH_ID_RSA"
fi
# Extract the YubiKey name for the notification
YUBIKEY_NAME=$(echo "$selected" | awk '{split($0,a,"("); print a[1]}')
notify-send "SSH Key has been updated for $YUBIKEY_NAME"
exit 0