#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, нет?