从文件名中selectssh-agent的身份

问题:我有20-30个ssh-agent身份。 大多数服务器拒绝authenticationToo many failed authenticationsvalidationToo many failed authentications ,因为SSH通常不会让我尝试20个不同的密钥login。

目前,我正在使用IdentityFileIdentitiesOnly指令手动为每个主机指定身份文件,以便SSH只会尝试一个密钥文件,这是可行的。

不幸的是,只要原来的密钥不可用,就会停止工作。 ssh-add -l显示每个密钥文件的正确path,并且它们与.ssh/config的path匹配,但是不起作用。 显然,SSH通过公钥签名而不是文件名来select签名,这意味着原始文件必须是可用的,以便SSH可以提取公钥。

这有两个问题:

  • 只要我拔下闪存驱动器的钥匙,它就停止工作
  • 由于密钥文件在远程主机上不可用,它使得代理转发无用

当然,我可以从我的身份文件中提取公钥并将其存储在我的计算机上,以及我通常login的每台远程计算机上。 这看起来不是一个理想的解决scheme,但。

我需要的是可以通过文件名从ssh-agent中select一个身份,这样我就可以使用.ssh/config或通过传递-i /path/to/original/key来轻松select正确的-i /path/to/original/key ,即使在远程主机我SSH'd成。 如果我可以“昵称”这些键,甚至不需要指定完整的path就更好了。

猜猜我必须回答我自己的问题,因为似乎没有办法通过文件名来请求身份。

我写了一个快速而又脏的Python脚本,它为代理所拥有的每个密钥创build一个公钥文件,该文件位于.ssh/fingerprints中。 然后,我可以使用IdentityFile指定这个不包含密钥的文件,SSH将从SSH代理中select正确的身份。 完美的工作,并允许我使用代理为我希望的许多私钥。

 #!/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() 

 ssh-add -L | gawk ' { print $2 > $3 ".pub" } ' 

在远程计算机上自动生成所有的公钥文件(假设.ssh/config中的.ssh/config被命名为privateKeyFileName.pub并且不涉及任何不方便的path)。 为你的sudo情况调用chown $USER .ssh/*

从接受的解决scheme中提取,并假设您只是想重用用于访问初始服务器的身份,则类似于:

 Host github.com IdentitiesOnly yes IdentityFile ~/.ssh/authorized_keys 

是足够的。