如何在ruby-gitgem之间切换SSH密钥?

How to switch between SSH keys with the ruby-git gem?

有什么方法可以即时为 ruby-git gem 配置设置不同的 SSH 密钥,这样我就可以使用不同的私有存储库了吗?

我所做的工作很好,但它只适用于一个 SSH 密钥。

我在 Rails 应用程序的根文件夹中创建了 /ruby_git.sh

#!/bin/bash
exec /usr/bin/ssh -o StrictHostKeyChecking=no -i ./certs/private_key "$@"

我已经使用我的 SSH 密钥创建了 /certs/private_key

-----BEGIN OPENSSH PRIVATE KEY-----
...
-----END OPENSSH PRIVATE KEY-----

我创建了 /initializers/git_init.rb:

Git.configure do |config|
  config.git_ssh = Rails.root.join("ruby_git.sh").to_s
end

我也尝试过另一种方法,在运行时为每个 repo 创建自定义 sh 脚本和 SSH 私钥文件,并在使用后删除它们。但这似乎在全球范围内改变了 Git,所以下一个 thread/session 继承了新的 Git 配置:

# @repo_id, @ssh_url and @private_key are instance variables set
# based on the repo that we try to interact with

cert_path   = Rails.root.join("git_config", "certs", @repo_id).to_s
config_path = Rails.root.join("git_config", "configs", "#{@repo_id}.sh").to_s
git_config  = "#!\/bin\/bash\n\nexec \/usr\/bin\/ssh -o StrictHostKeyChecking=no -i #{cert_path} \"$@\""

File.open(config_path, "w") { |f|
  f.write(git_config)
}

File.open(cert_path, "w") { |f|
  f.write(@private_key)
}

File.chmod(0755, config_path)
File.chmod(0600, cert_path)

Git.init

Git.configure { |config|
  config.git_ssh = config_path
}

Git.ls_remote(@ssh_url)

FileUtils.remove_entry(cert_path)
FileUtils.remove_entry(config_path)

我尝试使用 ~/.ssh/config。以下是有效的,但它不符合我的需要。

Host github.com
  PreferredAuthentications publickey
  IdentityFile /home/ubuntu/.ssh/repo_1_private_key

我正在使用多个存储库。为他们每个人创建的 SSH 对。 Public 部分用作部署密钥。没有用户。

我需要测量一对 repo/key 与另一对的关系,不要让 ssh 访问其他密钥或遍历它们。

类似

Host github.com/organization_1/repo_1
  PreferredAuthentications publickey
  IdentityFile /home/ubuntu/.ssh/repo_1_private_key

Host github.com/organization_2/repo_2
  PreferredAuthentications publickey
  IdentityFile /home/ubuntu/.ssh/repo_2_private_key

不工作,因为 github.com/organization/repo 不与 github.com 主机匹配,并且在尝试 git clone git@github.com:organization/repo.git.

时跳过配置

您可以说,但是 ruby 设置为 git -c core.sshcommand='/usr/bin/ssh -F my.temp.config' 并在该临时配置中设置一次性连接设置参数。

您是否尝试放置 ssh 配置文件并指定要连接的主机?

我还没有处理过 ruby 脚本。我已经处理过 ssh 足以处理此类事情。有一个 ssh 配置文件可以帮助我解决此类用例。这是~/.ssh/config

在你的用例中,你能尝试像下面这样的设置吗,

Host myfriendlyhostname1
     HostName git.example.com
     User user1
     Port 1234
     IdentityFile ~/.ssh/id_rsa1

Host myfriendlyhostname2
     HostName git.example.com
     User user2
     Port 1234
     IdentityFile ~/.ssh/id_rsa2

这是做什么的, 如果将上面的内容放在 ~/.ssh/config 文件中,这将映射配置的名称以选择连接

In your case, I assume you have same host different credentials right?

如果您 ssh myfriendlyhostname1,它将使用为 user1 提供的身份连接到 git.example.com

如果您 ssh myfriendlyhostname2,它将使用为 user2 提供的身份连接到 git.example.com

搜索时,我发现这个 link 有更多示例,https://linuxize.com/post/using-the-ssh-config-file/

我没试过的是 git clone 使用 myfriendlyhostname1 如果您尝试过,请告诉我结果如何。