Как переключаться между SSH-ключами с помощью ruby-git gem?

#ruby-on-rails #ruby #git #ruby-git

#ruby-on-rails #ruby #git #ruby-git

Вопрос:

Есть ли какой-либо способ установить разные SSH-ключи для конфигурации ruby-git gem «на лету», чтобы я мог работать с разными частными репозиториями?

То, что я сделал, работает хорошо, но работает только с одним SSH-ключом.

Я создал /ruby_git.sh в корневой папке своего приложения Rails:

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

Я создал /certs/private_key с помощью своего SSH-ключа:

 -----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
 

Я также попробовал другой подход: создавать пользовательские sh-скрипты и файлы закрытых ключей SSH для каждого репозитория во время выполнения и удалять их после использования. Но, похоже, это меняется Git глобально, поэтому следующий поток / сеанс наследует новую 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/bashnnexec /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. Открытая часть используется в качестве ключа развертывания. Нет пользователей.

Мне нужно измерить одну пару репозитория / ключа из другой и не позволять 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 .

Комментарии:

1. Я думаю, вам придется добавить Host org1.github.com Hostname github.com PreferredAuthentications publickey IdentityFile /home/ubuntu/.ssh/repo_1_private_key , а затем git clone git@org1.github.com:organization/repo.git

Ответ №1:

Вы пробовали размещать конфигурационный файл 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 файл, это сопоставит имя конфигурации для выбора соединения

В вашем случае, я полагаю, у вас одинаковые учетные данные для разных хостов, верно?

Если вы ssh myfriendlyhostname1 , он подключится, используя идентификатор, указанный для user1 git.example.com .

Если вы ssh myfriendlyhostname2 , он подключится, используя идентификатор, указанный для user2 git.example.com .

При поиске я нашел эту ссылку с большим количеством примеров, https://linuxize.com/post/using-the-ssh-config-file /

Чего я не пробовал, так это git clone использовать myfriendlyhostname1 , если вы пробовали, дайте мне знать, как это прошло.

Комментарии:

1. Привет @reflexdemon проверьте правки, которые я внес в вопрос, который пытается решить его, как вы предложили.

Ответ №2:

Вы можете сказать, как бы ruby ни настраивался, git -c core.sshcommand='/usr/bin/ssh -F my.temp.config' и настроить параметры настройки одноразового подключения в этой временной конфигурации.

Комментарии:

1. Спасибо @jthill, но не могли бы вы предоставить больше информации? Пример сценария оболочки и как вызвать его из Ruby. Наличие одной конфигурации tmp не будет потокобезопасным, поскольку несколько потоков могут пытаться выполнять запись и чтение из нее.

2. Я не знаю ruby, в сценариях оболочки вы просто говорите mktemp , и вы получаете уникальный временный файл, есть варианты, где. У Ruby должен быть эквивалент; и я думаю, что его привязки к git позволяют вам указывать параметры в команде git, нет?