149 lines
4.5 KiB
Bash
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
|