#!/bin/bash # SPDX-License-Identifier: GPL-3.0-or-later # This script manages the SSH agent, allowing you to start, stop, and reload it. # Require script: core/lamguages.sh # Usage: # sagent_start - Start the SSH agent and add a private key. # sagent_stop - Stop the SSH agent. # sagent_reload - Reload the SSH agent and list added keys. function sshagent_start { local ssh_dir="$HOME/.ssh" local default_lifetime="5d" local key_path="" local lifetime="$default_lifetime" local seconds=0 local human_lifetime="" msg "Buscando claves privadas en $ssh_dir..." "Looking for private keys in $ssh_dir..." mapfile -t keys < <(find "$ssh_dir" -type f -not -name "*.pub" -exec grep -l "PRIVATE KEY" {} \;) local key_count=${#keys[@]} if [ "$key_count" -eq 0 ]; then msg_err "No se encontraron claves privadas en $ssh_dir" "No private keys found in $ssh_dir" return 1 elif [ "$key_count" -eq 1 ]; then key_path="${keys[0]}" msg "Una sola clave encontrada: $key_path" "Single key found: $key_path" else msg "Selecciona la clave que deseas agregar al agente SSH:" "Select the key you want to add to the SSH agent:" select key in "${keys[@]}" "$(msg 'Cancelar' 'Cancel')"; do if [[ "$REPLY" =~ ^[0-9]+$ ]]; then if (( REPLY >= 1 && REPLY <= key_count )); then key_path="$key" break elif (( REPLY == key_count + 1 )); then msg "Operación cancelada." "Operation cancelled." return 0 else msg "Opción fuera de rango." "Option out of range." fi else msg "Entrada no válida. Solo números." "Invalid input. Numbers only." fi done fi read -rp "$(msg "¿Tiempo de vida del agente? (Ej: 5m, 2h, 1d) [${default_lifetime}]: " \ "Agent lifetime? (e.g., 5m, 2h, 1d) [${default_lifetime}]: ")" user_input lifetime="${user_input:-$default_lifetime}" local num=${lifetime//[!0-9]/} local unit=${lifetime//[0-9]/} case "$unit" in s|"") seconds=$num; human_lifetime="$(msg "$num segundo(s)" "$num second(s)")" ;; m) seconds=$((num * 60)); human_lifetime="$(msg "$num minuto(s)" "$num minute(s)")" ;; h) seconds=$((num * 3600)); human_lifetime="$(msg "$num hora(s)" "$num hour(s)")" ;; d) seconds=$((num * 86400)); human_lifetime="$(msg "$num día(s)" "$num day(s)")" ;; *) msg_err "Unidad de tiempo inválida. Usa s, m, h o d." "Invalid time unit. Use s, m, h or d."; return 1 ;; esac rm -rf /tmp/ssh-* > /dev/null SSH_ENV="$HOME/.ssh/environment" msg "Inicializando nuevo agente SSH..." "Initializing new SSH agent..." ssh-agent | sed 's/^echo/#echo/' > "$SSH_ENV" chmod 600 "$SSH_ENV" # shellcheck source=/dev/null source "$SSH_ENV" > /dev/null if ssh-add -t "$seconds" "$key_path" >/dev/null 2>&1; then msg "Clave agregada correctamente: $key_path (vida: $human_lifetime)" \ "Key added successfully: $key_path (lifetime: $human_lifetime)" else msg_err "Error al agregar la clave." "Failed to add SSH key." fi } function sshagent_stop { rm -rf /tmp/ssh-* > /dev/null ssh-agent -k > /dev/null msg "Agente SSH detenido." "SSH agent stopped." } function sshagent_findsockets { find /tmp -uid "$(id -u)" -type s -name agent.\* 2>/dev/null } function sshagent_testsocket { if ! command -v ssh-add >/dev/null; then msg_err "ssh-add no está disponible. Cancelando prueba de socket." \ "ssh-add is not available. Cancelling socket test." return 1 fi [ -n "$1" ] && export SSH_AUTH_SOCK=$1 [ -z "$SSH_AUTH_SOCK" ] && return 2 if [ -S "$SSH_AUTH_SOCK" ]; then ssh-add -l > /dev/null case $? in 2) msg "Socket $SSH_AUTH_SOCK no responde. Eliminando..." \ "Socket $SSH_AUTH_SOCK is unresponsive. Removing..." rm -f "$SSH_AUTH_SOCK" return 4 ;; 0) msg "Agente SSH encontrado en $SSH_AUTH_SOCK" \ "Found SSH agent at $SSH_AUTH_SOCK" return 0 ;; esac else msg_err "$SSH_AUTH_SOCK no es un socket válido." "$SSH_AUTH_SOCK is not a valid socket." return 3 fi } function sshagent_reload { local AGENTFOUND=0 if sshagent_testsocket; then AGENTFOUND=1; fi if [ $AGENTFOUND -eq 0 ]; then for agentsocket in $(sshagent_findsockets); do if sshagent_testsocket "$agentsocket"; then AGENTFOUND=1 break fi done fi if [ $AGENTFOUND -eq 0 ]; then eval "$(ssh-agent)" fi unset AGENTFOUND unset agentsocket ssh-add -l } if [[ -f "$HOME/.ssh/environment" ]]; then sshagent_reload > /dev/null 2>&1 fi alias sagent_start="sshagent_start" alias sagent_stop="sshagent_stop" unset -f sshagent_findsockets sshagent_testsocket