更新:只是为了确认有关我的设置的更多信息,以防不清楚:
没有任何私钥在任何地方被共享。
(1) 使用 Mac 的程序员每个人都有一个 SSH 密钥(在 ~/.ssh/id_rsa 中),他们用这个密钥连接到我的所有 BitBucket 存储库(一个公司帐户)。公钥元素放在 BitBucket 中以授权他们,并批准该程序员访问我的所有 BitBucket 存储库。
(2) 每个 Ubuntu 服务器都有自己的密钥对设置,并且为每个获准的 BitBucket 存储库都有一个 SSH 密钥。每个公钥都放置在每个相应的 BitBucket 存储库中。
基本上,我试图让一个 composer.json 文件(使用下面显示的 URL 格式)同时供人类和服务器使用(即,当一个人拥有一个 SSH 密钥来访问我所有的 BitBucket 存储库(同一个帐户)时工作 - 并且 - 当服务器拥有单独的 SSH 密钥来访问他们被批准的每个 BitBucket 存储库时)。
--
我需要能够配置我的 ~/.ssh/config 文件以使用所有这些 URL:
[email protected]:username/repository-abc.git
[email protected]:username/repository-12345.git
[email protected]:username/another-repo.git
...但我不能使用别名。
所以我不能这样做:
git@alias1:username/repository-abc.git
git@alias2:username/repository-12345.git
git@alias3:username/another-repo.git
原因是 URL 应该放在 composer.json 文件中,该文件也被本地开发计算机使用,这些计算机只对所有 BitBucket 存储库使用一个 SSH 密钥 - 并且未配置为理解所有不同的别名。
我可以按照我想要的方式配置服务器,服务器上有以下 ~/.ssh/config 配置。
每当它尝试读取无效的私钥文件时(例如,第二个/第三个存储库将首先尝试读取第一个文件),它都会失败。但是,如果我有选择地输入正确的 SSH 密钥密码,而当它不正确时忽略(只需按 Enter),这种方法可能会奏效。
Host bitbucket.org
HostName bitbucket.org
IdentityFile ~/.ssh/alias1_private_key
Host bitbucket.org
HostName bitbucket.org
IdentityFile ~/.ssh/alias2_private_key
Host bitbucket.org
HostName bitbucket.org
IdentityFile ~/.ssh/alias3_private_key
配置别名很容易,但是由于开发计算机无法理解这一点,所以我陷入了困境。
有没有办法做下面这样的事情,以便它可以适用于一切?
Host bitbucket.org
HostName bitbucket.org
Url [email protected]:username/repository-abc.git
IdentityFile ~/.ssh/alias1_private_key
Host bitbucket.org
HostName bitbucket.org
Url [email protected]:username/repository-12345.git
IdentityFile ~/.ssh/alias2_private_key
答案1
如果我理解正确的话,每个存储库都有一个不同的authorized_key,每个这样的密钥的私有一半在应该能够访问该存储库的众多用户之间共享?
如果是这样,则您的问题是由服务器端的根本设置问题引起的。密钥用于验证用户身份,并且用户有权执行某些操作;不应使用密钥直接证明授权。
该模型应该是“每个用户一个密钥,每个用户的密钥出现在多个存储库中“, 不是 ”每个仓库一个密钥,每个仓库的密钥在许多用户之间共享“。就是因为有人sshd
在服务器端折磨你,导致你在客户端找不到简单的方法解决这个问题。
我希望我错了,并且有人有更好的建议,但如果没有,那么对sshd
身份验证模型的根本误用就导致了问题。
编辑:好的,您的澄清很有帮助,但您仍然在扭曲模型。Ubuntu 服务器不是独立于用户、可以自行行动的事物;在 Ubuntu 服务器上运行的进程仍将在特定 UID 下运行。
UNIX 通常不区分用户交互完成的事情和用户不在场时代表用户完成的事情,而如果试图区分的话,您会给自己带来麻烦(该规则有许多例外,例如sudo
,但即便如此,这些例外也常常回到规则,例如Default !requiretty
和NOPASSWD
子句,用于模拟交互式的非交互式使用)。
将运行非交互式进程的 UID 视为一个人,它也有一个密钥对,该密钥对的公共部分在该进程的 UID 被授权前往的任何地方使用,问题就会消失。
如果有良好的商业理由为什么你不能这么做,现在是告诉我们的好时机。
答案2
SSH 的配置并不关心每个 HostName 上的目录路径。它只关心主机名和用于特定主机的私钥。
因此,您无法使用单个配置文件来实现您的目标。
您需要能够config
为每个存储库使用单独的 SSH 文件,然后以某种方式告知git
使用该配置文件与 SSH。但是,我不知道是否可以用 指定 SSH 配置文件参数git
。