更新:只是为了确认更多关于我的设置,以防不清楚:
没有私钥在任何地方共享。
(1)使用Mac的人类程序员每个都有一个SSH密钥(在〜/ .ssh / id_rsa中),用于连接到我所有的BitBucket存储库(一个公司帐户)。 公钥元素被放置在BitBucket中授权他们,并批准所有我的BitBucket存储库的人。
(2)Ubuntu服务器每个都有自己的密钥对设置,并且每个BitBucket存储库都有一个SSH密钥。 每个公钥放在每个相应的BitBucket存储库中。
基本上我试图让一个composer.json文件(使用下面显示的URL格式)为人类和服务器工作(即当人类有一个SSH密钥访问我所有的BitBucket存储库(相同的帐户)当服务器有单独的SSH密钥访问每个BitBucket存储库时,他们被批准)。
–
我需要能够configuration我的〜/ .ssh / config文件来使用所有这些URLS:
[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密钥,并且未configuration为了解所有不同的别名。
我可以configuration服务器,但是我在服务器上configuration了下面的〜/ .ssh / configconfiguration。
每当它尝试读取无效的私钥文件(例如,第二/第三回购将尝试首先读取第一个)时,它将失败。 但是,如果我select性地inputSSH密钥密码时,这可以工作,但是,如果密码不正确,忽略(只是按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
configuration别名会很容易,但是由于开发计算机不理解,所以我被卡住了。
有没有办法做到这一点,以便它可以为一切工作?
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
如果我理解正确,每个存储库有一个不同的authorized_key,每个这样的密钥的私人一半是应该能够访问该存储库的许多用户共享?
如果是这样,你的问题是由服务器端的基本破坏设置造成的。 Keysauthentication用户,用户有权做某些事情; 不能用钥匙直接certificate授权。
模型应该是“ 每个用户一把钥匙,每个用户的钥匙出现在许多回购中 ”,而不是“ 每个回购一把钥匙,每个回购的钥匙在许多用户之间共享 ”。 这是因为有人在服务器端折磨sshd ,所以在客户端找不到一个简单的方法来解决这个问题。
我希望我错了,有人有一个更好的build议,但如果他们不这样做,这是sshd的身份validation模型的根本滥用正在导致问题。
编辑 :好的,你的澄清有帮助,但你仍然在折磨模型。 一个Ubuntu服务器不是一个独立于用户的东西,它可以独立运行。 在Ubuntu服务器上运行的进程仍然在特定的UID下运行。
UNIX通常不会区分用户交互操作完成的事情和他/她不在的情况下完成的事情,并且试图区分这些事情是由于自己的问题造成的(规则有许多例外,就像sudo一样,但即使如此,例外情况往往又回到了规则,例如Default !requiretty和NOPASSWD子句,用于模拟交互的非交互式使用。
将运行非交互式进程的UID视为一个人,也就是拥有一个密钥对,UID有权去往的进程处处使用公共的一半,问题就会消失。
如果有一个很好的商业原因,为什么你不能这样做,现在是一个好时机告诉我们。
SSH的configuration不关心每个HostName上的目录path。 它只关心主机名和他们用于特定主机的私钥。
所以你不能使用单个configuration文件来实现你想要的。
您需要能够为每个存储库使用单独的SSH config文件,然后以某种方式告诉git使用该configuration文件与SSH。 但是,我不知道SSHconfiguration文件参数是否可以用git来指定。