Browse Source

ssh-agent: use key signatures to check loaded ids (#7504)

Use fingerprint of ssh key instead of file name to control if the key is already loaded.

Also check for .ssh folder presence (#5128)
François Scala 6 years ago
parent
commit
2a60385659
1 changed files with 18 additions and 6 deletions
  1. 18 6
      plugins/ssh-agent/ssh-agent.plugin.zsh

+ 18 - 6
plugins/ssh-agent/ssh-agent.plugin.zsh

@@ -12,16 +12,28 @@ function _start_agent() {
 }
 }
 
 
 function _add_identities() {
 function _add_identities() {
-	local id line
-	local -a identities ids
+	local id line sig
+	local -a identities loaded signatures
 	zstyle -a :omz:plugins:ssh-agent identities identities
 	zstyle -a :omz:plugins:ssh-agent identities identities
 
 
-	# get list of loaded identities
-	for line in ${(f)"$(ssh-add -l)"}; do ids+=${${(z)line}[3]}; done
+	# check for .ssh folder presence
+	if [[ ! -d $HOME/.ssh ]]; then
+		return
+	fi
+
+	# get list of loaded identities' signatures
+	for line in ${(f)"$(ssh-add -l)"}; do loaded+=${${(z)line}[2]}; done
+
+	# get signatures of private keys
+	for id in $identities; do
+		signatures+="$(ssh-keygen -lf "$HOME/.ssh/$id" | awk '{print $2}')	$id"
+	done
 
 
 	# add identities if not already loaded
 	# add identities if not already loaded
-	for id in ${^identities}; do
-		[[ ${ids[(I)$HOME/.ssh/$id]} -le 0 ]] && ssh-add $HOME/.ssh/$id
+	for sig in $signatures; do
+		id="$(cut -f2 <<< $sig)"
+		sig="$(cut -f1 <<< $sig)"
+		[[ ${loaded[(I)$sig]} -le 0 ]] && ssh-add $HOME/.ssh/$id
 	done
 	done
 }
 }