Як натиснути на git на EC2


78

Я намагаюся виконувати цю інструкцію. У мене є локальне репозиторій git, і коли я роблю натискання git, мені потрібно, щоб репо було перенесене до мого екземпляра EC2.

Але, у наведеному вище підручнику, коли я роблю a git push origin master, я отримую Permission denied (publickey)помилку, оскільки я не вказав файл посвідчення.

Скажімо, я заходжу до EC2 так: ssh -i my_key.pem username@11.111.11.11

Отже, чи можу я зробити щось подібне тут: git -i my_key.pem push origin masterабо встановити файл посвідчення в.git/config

Отже, як я можу це налаштувати?

Оновлення: вихідний файл git config -l

user.name=my name
user.email=my_email_addreess@gmail.com
github.user=userid
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
core.ignorecase=true
remote.origin.url=ec2_id@my_e2_ip_address:express_app
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*

Оновлення (з коментаря @ Jon ):

Якщо у вас є ключ у непарному шляху, просто запустіть ssh-add /private/key/path. Це спрацювало для мене.


16
ssh-add /private/key/pathпрацював!
zengr

1
Коли ви говорите, що це спрацювало, чи можете ви додати інструкції щодо того, що ви насправді робили покроково?
designermonkey

@Designermonkey Оновлено.
zengr

На якій машині ви запускаєте це, на локальному або екземплярі EC2? Що є express_appу вашій конфігурації?
designermonkey

@Designermonkey його на екземплярі ec2. Це назва git repo, яке є експрес-програмою фреймворку вузла.
zengr

Відповіді:


53

Щоб скопіювати локальний ключ ssh на Amazon, спробуйте це

cat ~/.ssh/id_?sa.pub | ssh -i amazon-generated-key.pem ec2-user@amazon-instance-public-dns "cat >> .ssh/authorized_keys"

замінивши імена ключа та публічного dns Amazon ec2, звичайно.

тоді ви зможете налаштувати пульт на Amazon


3
Я слідував цьому, але використовував ключ RSA замість ключа DSA. Крім того, я додав пробіл між кішкою і >>, наприклад: "cat >> .ssh /
allowed_keys

4
це не відповідає на питання про те, як ми вказуємо ключ під час виконання команди git push
psvj

27

Інструкції, перелічені тут, були для мене більш корисними.

За посиланням:

Налаштуйте ~/.ssh/configі додайте:

Host example
Hostname example.com
User myuser
IdentityFile ~/.ssh/other_id_rsa

Тепер використовуйте псевдонім хоста ssh як ваше сховище:

$ git remote add origin example:repository.git
$ git pull origin master

І він повинен використовувати other_id_rsaключ!


2
Я також знайшов корисне від цього до git remote add ec2 ssh://ubuntu@54.243.293.151:zivot. Я не знав, що до цього можна було вводити префікси до адрес ssh://.
ізоморфізми

Чудова відповідь, я сподівався скористатися конфігурацією ssh, яку я вже використовую.
Ерік Вілсон,

Приголомшливо Це краще, ніж з’ясувати повну URL-адресу.
Сайфур Рахман Мохсін

20

На локальній машині відредагуйте файл ~ / .ssh / config і додайте:

Host example
Hostname example.com
User myuser
IdentityFile ~/.ssh/YOURPRIVATEKEY

Ви повинні мати можливість увійти у свій екземпляр за допомогою "ssh example". Пам'ятайте, що ваш приватний ключ повинен бути chmod 400. Після того, як ви зможете ввести ssh, не використовуючи "ssh -i mykey.pem username @ host", виконайте наступне.

На вашому екземплярі EC2 ініціалізуйте відкрите сховище, яке використовується виключно для надсилання. Домовленість полягає у додаванні розширення ".git" до імені папки. Це може виглядати інакше, ніж у вашому локальному репо, яке зазвичай має папку .git усередині папки "project". Голі сховища (за визначенням) не мають приєднаного до них робочого дерева, тому ви не можете легко додавати до них файли, як це було б у звичайному неголому сховищі. Це просто вони так роблять. На вашому екземплярі ec2:

mkdir project_folder.git
cd project_folder.git
git init --bare

Тепер, повернувшись на локальну машину, використовуйте псевдонім хоста ssh при налаштуванні пульта.

git remote add ec2 EXAMPLEHOSTFROMSSHCONFIG:/path/to/project_folder.git

Тепер ви зможете зробити:

git push ec2 master

Тепер ваш код без проблем передається на сервер. Але на даний момент проблема полягає в тому, що ваша папка www на екземплярі ec2 не містить фактичних "робочих файлів", які ваш веб-сервер повинен виконати. Отже, вам потрібно встановити скрипт "гачок", який буде виконуватися при натисканні на ec2. Цей скрипт заповнить відповідну папку на вашому екземплярі ec2 вашими фактичними файлами проекту.

Отже, на вашому екземплярі ec2 перейдіть до каталогу project_folder.git / hooks. Потім створіть файл із назвою "після отримання" та chmod 775 (він повинен бути виконуваним). Потім вставте цей скрипт bash:

#!/bin/bash
while read oldrev newrev ref
do
  branch=`echo $ref | cut -d/ -f3`
  if [ "ec2" == "$branch" -o "master" == "$branch" ]; then
    git --work-tree=/var/www/example.com/public_html/ checkout -f $branch    
    echo 'Changes pushed to Amazon EC2 PROD.'
  fi
done

Тепер на вашій локальній машині виконайте "git push ec2 master", і він повинен пересунути код до вашого оголеного репо, а потім скрипт підключення після отримання перевірить ваші файли у відповідну папку, яку ваш веб-сервер налаштований для читання.


1
це працює для мене. chmods дуже важливі. @devdrc, можливо, вам доведеться відредагувати його далі та підкреслити оператори командного рядка.
Abel Callejo

частина до сценарію bash чудово працювала, але сценарій bash для мене не працював. Ця відповідь stackoverflow.com/a/24027870/847954 для мене чудово спрацювала. Дякую devdrc за цей допис та @blamb за розміщення сценарію.
джефф Маск

@jeffmusk вам потрібно переконатись, що post-receiveфайл є виконуваним
Абель Каллехо

5

Вам потрібно згенерувати та завантажити ключ SSH на екземпляр EC2. Дотримуйтесь цього підручника: http://alestic.com/2010/10/ec2-ssh-keys


2
але я вже маю при собі закритий ключ пари ключ-значення, який я використовував для входу в EC2.
zengr

Спробуйте деякі рішення у цій темі: serverfault.com/questions/39733/…
Джон,

2
Я розумію цю частину, але це проблема конфігурації Git.
zengr

Я не бачу нічого поганого у вашій конфігурації, тому я вважаю, що це щось не так з вашими ключами SSH, або неправильно розміщене, або що ні - швидше за все, це буде не ваша конфігурація.
Джон

6
Якщо у вас є ключ у непарному шляху, просто запустіть ssh-add /private/key/path.
Джон

4

Я виявив, що це був найшвидший спосіб: https://gist.github.com/matthewoden/b29353e266c554e04be8ea2058bcc2a0

В основному:

ssh-add /path/to/keypair.pem ("-add" має бути ВПРАВО ПІСЛЯ ssh)

перевірте, чи працює це: ssh ubuntu@crazylongAWSIP (можливо, ваше ім'я користувача не є ubuntu)

Після цього ви можете встановити репозиторій git на своєму ec2 і натиснути на нього:

git remote add origin ec2Username@long-crazy-amazon-ip.com:/path/to/your/repo-name.git 
git config --global remote.origin.receivepack "git receive-pack" # needed for aws ec2 stuff.
git push origin master

Ваші варіанти полягають у тому, щоб встановити `` оголене '' репозиторій git на вашому ec2 (що означає, що інші репозиторії git можуть витягувати з нього та натискати на нього, але він не буде містити жодних файлів), або ви можете встановити НОРМАЛЬНЕ репо та натиснути до нього безпосередньо (моя перевага, якщо ви хочете підштовхнути локальні зміни до вашого ec2 без необхідності постійно вводити ssh у ваш ec2).

Якщо ви хочете встановити ЗВИЧАЙНИЙ репо на ec2, ssh в ec2, зробіть, git initде хочете, а потім виконайте наступне :

git config receive.denyCurrentBranch updateInstead

Дивіться: не вдається натиснути на сховище git для пояснення "отримати заперечення поточної гілки"


2
  1. Біжи ssh-keygen локально
  2. Тепер у вашому локальному ~/.ssh/ каталозі ви повинні побачити файл із відкритим ключемid_rsa.pub - скопіюйте вміст цього файлу у /etc/ssh/authorized_keysфайл, який знаходиться на віддаленому сервері .

Ви можете скопіювати та вставити вміст, або спершу завантажити файл на віддалений сервер і скористатися наступною командою:

cat id_rsa.pub >> /etc/ssh/authorized_keys


1
Чи однакові кроки 2 і 3?
JoeTidee

Ні, @JoeTidee - крок 2 отримує ключ на віддаленому сервері, а крок 3 додає його в потрібне місце. :)
Аластер

1

Думаю, я не публікую тут нічого нового, але мені довелося перекопати наведені вище відповіді для розгляду мого конкретного випадку. У мене є екземпляр Ubuntu на EC2.

Щоб увійти в свій екземпляр, мені потрібно було виконати:

ssh -i "pemfile.pem" ubuntu@very-long-amazon-address

ключовий файл "pemfile.pem" повинен бути в лапках.

Я додав пульт:

remote add origin ubuntu@very-long-amazon-address/home/ubuntu/git/REPO/gitfile.git

Але коли я намагався натиснути:

git push origin master

Я зрозумів, я отримав:

Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

Для виправлення я зробив:

/<path to pemfile>/pemfile.pem

Що дало мені відповідь,

Identity added: /<path to pemfile>/pemfile.pem (/<path to pemfile>/pemfile.pem )

Після чого поштовх пройшов нормально.


5
Я не розумію, коли ти кажеш "Для виправлення, що я зробив: / шлях до pemfile /", мій pemfile.pem нічого не виконує .... яку команду ти використовуєш для додавання посвідчення?
rikkitikkitumbo

будь ласка, вкажіть і завершіть свою відповідь, яку команду ви використовували для додавання ключа ???
Enginerd Sunio

0

Я отримував дозвіл під час розгортання через керування джерелом, і не міг зрозуміти, чому. Я зрозумів, що моїм користувачем, для якого я створював ключ ssh (з іменем ubuntu, також рекомендованим логіном для мого сервера ec2), не був той користувач, який відповідав за розгортання шапки (root). Запуск ssh-keygen для root та завантаження цього ssh-ключа як ключа розгортання до bitbucket вирішили мої проблеми.



0

Ось найпростіший спосіб, який чудово працював для мене ... У мене були проблеми з клонуванням сховища ... він не розпізнав створений мною ключ SSH ... Замість того, щоб змінити ваш конфігураційний файл і все таке, я просто скопіював REAL ssh, з яким він намагався підключитися, і я додав це до bitbucket ... ось команда:

 sudo vi /root/.ssh/id_rsa.pub

Використовував VI для відкриття РЕАЛЬНОГО ключа RSA та копіював вміст та вставляв у bitbucket ... Готово!


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.