hyperterm/hyperterm/tools/ssh-agent.sh
Astound b491a1bd58
All checks were successful
CI Pipeline / shasums (push) Successful in 24s
git-sync-with-mirror / git-sync (push) Successful in 36s
CI Pipeline / build (push) Successful in 3m49s
update ssh agent
2025-06-22 00:06:16 -05:00

149 lines
4.5 KiB
Bash

#!/bin/bash
#------------
# SSH-AGENT
#------------
function sshagent_start {
local ssh_dir="$HOME/.ssh"
local lifetime="5d"
local key_path=""
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" {} \;)
if [ "${#keys[@]}" -eq 0 ]; then
msg_err "No se encontraron claves privadas en $ssh_dir" "No private keys found in $ssh_dir"
return 1
fi
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
case "$REPLY" in
''|*[!0-9]*)
msg "Entrada no válida. Solo números." "Invalid input. Numbers only."
;;
*)
if (( REPLY >= 1 && REPLY <= ${#keys[@]} )); then
key_path="$key"
break
elif (( REPLY == ${#keys[@]} + 1 )); then
msg "Operación cancelada." "Operation cancelled."
return 0
else
msg "Opción fuera de rango." "Option out of range."
fi
;;
esac
done
read -rp "$(msg $'\n¿Tiempo de vida del agente? (Ej: 5m, 2h, 1d) [5d]: ' $'\nAgent lifetime? (e.g., 5m, 2h, 1d) [5d]: ')" user_input
lifetime="${user_input:-5d}"
local num=${lifetime//[!0-9]/}
local unit=${lifetime//[0-9]/}
local seconds=0
local human_lifetime=""
case "$unit" in
s|"") seconds=$num; human_lifetime="$num $(msg 'segundo(s)' 'second(s)')" ;;
m) seconds=$((num * 60)); human_lifetime="$num $(msg 'minuto(s)' 'minute(s)')" ;;
h) seconds=$((num * 3600)); human_lifetime="$num $(msg 'hora(s)' 'hour(s)')" ;;
d) seconds=$((num * 86400)); human_lifetime="$num $(msg 'día(s)' '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
}
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
case "$1" in
"") ;;
*) export SSH_AUTH_SOCK=$1 ;;
esac
if [ -z "$SSH_AUTH_SOCK" ]; then return 2; fi
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
;;
*)
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 = 0 ]; then
for agentsocket in $(sshagent_findsockets); do
if [ $AGENTFOUND != 0 ]; then break; fi
if sshagent_testsocket "$agentsocket"; then AGENTFOUND=1; fi
done
fi
if [ $AGENTFOUND = 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