问题:我有大约 20-30 个ssh-agent
身份。大多数服务器拒绝使用 进行身份验证Too many failed authentications
,因为 SSH 通常不会让我尝试 20 个不同的密钥来登录。
目前,我正在使用IdentityFile
和IdentitiesOnly
指令手动为每台主机指定身份文件,这样 SSH 将只尝试一个密钥文件,这是可行的。
不幸的是,一旦原始密钥不再可用,它就会停止工作。ssh-add -l
向我显示每个密钥文件的正确路径,它们与 中的路径匹配.ssh/config
,但它不起作用。显然,SSH 是通过公钥签名而不是文件名来选择身份的,这意味着原始文件必须可用,SSH 才能提取公钥。
这有两个问题:
- 一旦我拔下拿着钥匙的闪存驱动器,它就会停止工作
- 它使代理转发无用,因为密钥文件在远程主机上不可用
当然,我可以从我的身份文件中提取公钥并将它们存储在我的计算机上,以及我经常登录的每台远程计算机上。不过,这看起来不像是理想的解决方案。
我需要的是通过文件名从 ssh-agent 选择身份的可能性,这样我就可以轻松地使用.ssh/config
或通过传递选择正确的密钥-i /path/to/original/key
,即使在我通过 SSH 进入的远程主机上也是如此。如果我可以为这些键起“昵称”,这样我什至不必指定完整路径,那就更好了。
猜猜我必须回答我自己的问题,因为似乎没有任何方法可以通过文件名请求身份。
.ssh/fingerprints
我写了一个快速而简单的 Python 脚本,它为代理持有的每个密钥创建一个公钥文件。然后我可以使用 SSH 指定这个不包含密钥的文件,IdentityFile
SSH 将从 SSH 代理中选择正确的身份。工作得很好,并允许我使用代理来获得我想要的任意数量的私钥。跑
在远程机器上自动生成所有公钥文件(假设您的公钥
.ssh/config
已命名privateKeyFileName.pub
并且不涉及不一致的路径)。打电话chown $USER .ssh/*
给你的sudo
情况。从接受的解决方案中挑选,并假设您只想重用用于访问初始服务器的身份,然后是这样的:
足够了。
一种选择是为 SSH 创建一个小的包装脚本,它可以从 SSH 代理转发正确的公钥。这是一个有效的概念验证:
您可以创建一个单独的配置文件,将 SSH 密钥指纹与一个或多个主机名或昵称相关联,以便于使用。
这种技术的优势在于,除了将公钥添加到 SSH 代理之外,您无需预先或定期处理公钥。公钥文件根据需要写入,并在会话结束后立即删除。