问题:我有20-30个ssh-agent
身份。 大多数服务器拒绝authenticationToo many failed authentications
validationToo many failed authentications
,因为SSH通常不会让我尝试20个不同的密钥login。
目前,我正在使用IdentityFile
和IdentitiesOnly
指令手动为每个主机指定身份文件,以便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
是足够的。