Acho que vou ter que responder minha própria pergunta, já que parece não haver nenhuma maneira de solicitar uma identidade por nome de arquivo.
Eu escrevi um script Python rápido e sujo que cria um arquivo de chave pública em .ssh/fingerprints
para cada chave que o agente possui. Em seguida, posso especificar esse arquivo, que não contém nenhuma chave secreta, usando IdentityFile
e o SSH selecionará a identidade correta do agente SSH. Funciona perfeitamente bem e permite que eu use o agente para quantas chaves privadas eu desejar.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""Dumps all public keys held by ssh-agent and stores them in ~/.ssh/fingerprints/, so that
they can be identified using the IdentityFile directive.
"""
import sys, os
import stat
import re
import envoy
RE_MATCH_FILENAME = re.compile(r'([^\/:*?"<>|\r\n]+)\.\w{2,}$', re.IGNORECASE)
if os.getuid() == 0:
USERNAME = os.environ['SUDO_USER']
else:
USERNAME = os.environ['USER']
def error(message):
print "Error:", message
sys.exit(1)
def main():
keylist = envoy.run('ssh-add -L').std_out.strip('\n').split('\n')
if len(keylist) < 1:
error("SSH-Agent holds no indentities")
for key in keylist:
crypto, ckey, name = key.split(' ')
filename = os.path.join(os.environ['HOME'], '.ssh/fingerprints',
RE_MATCH_FILENAME.search(name).group(1)+'.pub')
with open(filename, 'w') as f:
print "Writing %s ..." % filename
f.write(key)
envoy.run('chmod 600 %s' % filename)
envoy.run('chown %s %s' % (USERNAME, filename))
if __name__ == '__main__':
main()