¿Hay alguna manera de configurar diferentes claves SSH para la configuración de gemas ruby-git sobre la marcha, para que pueda trabajar con diferentes repositorios privados?
Lo que he hecho funciona bien, pero funciona solo con una clave SSH.
/ruby_git.sh
en la carpeta raíz de mi aplicación Rails:
#!/bin/bash exec /usr/bin/ssh -o StrictHostKeyChecking=no -i ./certs/private_key "$@"
/certs/private_key
con mi clave SSH:
-----BEGIN OPENSSH PRIVATE KEY----- ... -----END OPENSSH PRIVATE KEY-----
He creado /initializers/git_init.rb
:
Git.configure do |config| config.git_ssh = Rails.root.join("ruby_git.sh").to_s end
También probé otro enfoque, para crear scripts sh personalizados y archivos de clave privada SSH para cada repositorio en tiempo de ejecución y eliminarlos después de su uso. Pero esto parece alterar Git
globalmente, por lo que el siguiente subproceso/sesión hereda la nueva configuración de 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)
Traté de trabajar con ~/.ssh/config
. Lo siguiente está funcionando, pero no satisface mis necesidades.
Host github.com PreferredAuthentications publickey IdentityFile /home/ubuntu/.ssh/repo_1_private_key
Estoy trabajando con varios repositorios. Par SSH creado para cada uno de ellos. Parte pública utilizada como clave de implementación. Sin usuarios
Necesito medir un par de repositorios/claves de otro y no dejar que ssh tenga acceso a otras claves o iterar a través de ellas.
algo como
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
no funciona porque github.com/organization/repo
no coincide con el host de github.com
y la configuración se omite cuando se intenta git clone git@github.com:organization/repo.git
.
¿Ha intentado colocar el archivo de configuración ssh y especificar a qué host conectarse?
No he tratado con scripts de Ruby. He tratado con ssh lo suficiente como para lidiar con tales cosas. Hay un archivo de configuración ssh que me ayuda en tales casos de uso. Es el ~/.ssh/config
En su caso de uso, ¿puede intentar tener alguna configuración como la siguiente línea?
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
Lo que esto hace es que si coloca lo anterior dentro de su archivo ~/.ssh/config
, esto asigna el nombre de la configuración para seleccionar la conexión.
En su caso, supongo que tiene las mismas credenciales de host diferentes, ¿verdad?
Si usa ssh myfriendlyhostname1
, se conectará usando la identidad provista para user1
a git.example.com
.
Si usa ssh myfriendlyhostname2
, se conectará usando la identidad provista para user2
a git.example.com
.
Cuando busqué, encontré este enlace que tiene más ejemplos, https://linuxize.com/post/using-the-ssh-config-file/
Lo que no he probado es git clone
usando myfriendlyhostname1
. Si lo intentaste, avísame cómo te fue.
Puede decir, sin embargo, Ruby se configura para decir, git -c core.sshcommand='/usr/bin/ssh -F my.temp.config'
y configurar sus parámetros de configuración de conexión de una sola vez en esa configuración temporal.