如何在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
如果您尝试过,请告诉我结果如何。
有什么方法可以即时为 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
如果您尝试过,请告诉我结果如何。