mirror of
https://github.com/ohmyzsh/ohmyzsh.git
synced 2026-01-30 02:44:42 +01:00
The ssh-agent plugin now adds all files in `~/.ssh/` that start with `-----BEGIN OPENSSH PRIVATE KEY-----`, regardless of their name. This fixes an issue where the plugin was only adding keys with hardcoded names. This change ensures that any valid OpenSSH private key will be added to the ssh-agent, improving compatibility and flexibility for users with custom key names.
122 lines
3.7 KiB
Bash
122 lines
3.7 KiB
Bash
# Get the filename to store/lookup the environment from
|
|
ssh_env_cache="$HOME/.ssh/environment-$SHORT_HOST"
|
|
|
|
function _start_agent() {
|
|
# Check if ssh-agent is already running
|
|
if [[ -f "$ssh_env_cache" ]]; then
|
|
. "$ssh_env_cache" > /dev/null
|
|
|
|
# Test if $SSH_AUTH_SOCK is visible
|
|
zmodload zsh/net/socket
|
|
if [[ -S "$SSH_AUTH_SOCK" ]] && zsocket "$SSH_AUTH_SOCK" 2>/dev/null; then
|
|
return 0
|
|
fi
|
|
fi
|
|
|
|
if [[ ! -d "$HOME/.ssh" ]]; then
|
|
echo "[oh-my-zsh] ssh-agent plugin requires ~/.ssh directory"
|
|
return 1
|
|
fi
|
|
|
|
# Set a maximum lifetime for identities added to ssh-agent
|
|
local lifetime
|
|
zstyle -s :omz:plugins:ssh-agent lifetime lifetime
|
|
|
|
# start ssh-agent and setup environment
|
|
zstyle -t :omz:plugins:ssh-agent quiet || echo >&2 "Starting ssh-agent ..."
|
|
ssh-agent -s ${lifetime:+-t} ${lifetime} | sed '/^echo/d' >! "$ssh_env_cache"
|
|
chmod 600 "$ssh_env_cache"
|
|
. "$ssh_env_cache" > /dev/null
|
|
}
|
|
|
|
function _add_identities() {
|
|
local id file line sig lines
|
|
local -a identities loaded_sigs loaded_ids not_loaded
|
|
zstyle -a :omz:plugins:ssh-agent identities identities
|
|
|
|
# check for .ssh folder presence
|
|
if [[ ! -d "$HOME/.ssh" ]]; then
|
|
return
|
|
fi
|
|
|
|
# If no keys specified in zstyle, add default keys.
|
|
# Mimics calling ssh-add with no arguments.
|
|
if [[ ${#identities[@]} -eq 0 ]]; then
|
|
# Iterate over files in .ssh folder.
|
|
for file in "$HOME/.ssh"/*; do
|
|
# Check if file is a regular file and starts with "-----BEGIN OPENSSH PRIVATE KEY-----".
|
|
if [[ -f "$file" && $(head -n 1 "$file") =~ ^-----BEGIN\ OPENSSH\ PRIVATE\ KEY----- ]]; then
|
|
# Add filename (without path) to identities array.
|
|
identities+=("${file##*/}")
|
|
fi
|
|
done
|
|
fi
|
|
|
|
# get list of loaded identities' signatures and filenames
|
|
if lines=$(ssh-add -l); then
|
|
for line in ${(f)lines}; do
|
|
loaded_sigs+=${${(z)line}[2]}
|
|
loaded_ids+=${${(z)line}[3]}
|
|
done
|
|
fi
|
|
|
|
# add identities if not already loaded
|
|
for id in $identities; do
|
|
# if id is an absolute path, make file equal to id
|
|
[[ "$id" = /* ]] && file="$id" || file="$HOME/.ssh/$id"
|
|
# check for filename match, otherwise try for signature match
|
|
if [[ -f $file && ${loaded_ids[(I)$file]} -le 0 ]]; then
|
|
sig="$(ssh-keygen -lf "$file" | awk '{print $2}')"
|
|
[[ ${loaded_sigs[(I)$sig]} -le 0 ]] && not_loaded+=("$file")
|
|
fi
|
|
done
|
|
|
|
# abort if no identities need to be loaded
|
|
if [[ ${#not_loaded} -eq 0 ]]; then
|
|
return
|
|
fi
|
|
|
|
# pass extra arguments to ssh-add
|
|
local args
|
|
zstyle -a :omz:plugins:ssh-agent ssh-add-args args
|
|
|
|
# if ssh-agent quiet mode, pass -q to ssh-add
|
|
zstyle -t :omz:plugins:ssh-agent quiet && args=(-q $args)
|
|
|
|
# use user specified helper to ask for password (ksshaskpass, etc)
|
|
local helper
|
|
zstyle -s :omz:plugins:ssh-agent helper helper
|
|
|
|
if [[ -n "$helper" ]]; then
|
|
if [[ -z "${commands[$helper]}" ]]; then
|
|
echo >&2 "ssh-agent: the helper '$helper' has not been found."
|
|
else
|
|
SSH_ASKPASS="$helper" ssh-add "${args[@]}" ${^not_loaded} < /dev/null
|
|
return $?
|
|
fi
|
|
fi
|
|
|
|
ssh-add "${args[@]}" ${^not_loaded}
|
|
}
|
|
|
|
# Add a nifty symlink for screen/tmux if agent forwarding is enabled
|
|
if zstyle -t :omz:plugins:ssh-agent agent-forwarding \
|
|
&& [[ -n "$SSH_AUTH_SOCK" ]]; then
|
|
if [[ ! -L "$SSH_AUTH_SOCK" ]]; then
|
|
if [[ -n "$TERMUX_VERSION" ]]; then
|
|
ln -sf "$SSH_AUTH_SOCK" "$PREFIX"/tmp/ssh-agent-$USERNAME-screen
|
|
else
|
|
ln -sf "$SSH_AUTH_SOCK" /tmp/ssh-agent-$USERNAME-screen
|
|
fi
|
|
fi
|
|
else
|
|
_start_agent
|
|
fi
|
|
|
|
# Don't add identities if lazy-loading is enabled
|
|
if ! zstyle -t :omz:plugins:ssh-agent lazy; then
|
|
_add_identities
|
|
fi
|
|
|
|
unset agent_forwarding ssh_env_cache
|
|
unfunction _start_agent _add_identities
|