Wie man auf EC2 git drückt

78

Ich versuche, dieser Anweisung zu folgen . Ich habe ein lokales Git-Repo und wenn ich einen Git-Push mache, muss das Repo auf meine EC2-Instanz übertragen werden.

Im obigen Tutorial git push origin mastererhalte ich jedoch eine Permission denied (publickey)Fehlermeldung, weil ich die Identitätsdatei nicht angegeben habe.

Angenommen, ich melde mich wie folgt bei EC2 an: ssh -i my_key.pem [email protected]

Kann ich hier etwas Ähnliches tun wie: git -i my_key.pem push origin masteroder die Identitätsdatei in setzen.git/config

Wie kann ich es einrichten?

Update: Ausgabe von git config -l

user.name=my name
[email protected]
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/*

Update (aus @ Jons Kommentar ):

Wenn Sie Ihren Schlüssel auf einem ungeraden Pfad haben, führen Sie ihn einfach aus ssh-add /private/key/path. Das hat bei mir funktioniert.

zengr
quelle
16
ssh-add /private/key/pathhat funktioniert!
Zengr
1
Wenn Sie sagen, dass es funktioniert hat, können Sie dann Schritt für Schritt Anweisungen hinzufügen, was Sie tatsächlich getan haben?
Designermonkey
@Designermonkey Aktualisiert.
Zengr
Auf welchem ​​Computer wird das ausgeführt, auf lokaler oder EC2-Instanz? Was ist das express_appin deiner Konfiguration?
Designermonkey
@Designermonkey ist auf ec2 Instanz. Es ist der Name des Git Repo, der Express Framework App eines Knotens.
Zengr

Antworten:

52

Versuchen Sie dies, um Ihren lokalen SSH-Schlüssel nach Amazon zu kopieren

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

Natürlich die Namen des Schlüssels und der öffentlichen DNS von amazon ec2 ersetzen.

Sie können dann Ihre Fernbedienung auf Amazon einrichten

realgt
quelle
3
Ich folgte dem, benutzte aber einen rsa-Schlüssel anstelle eines dsa-Schlüssels. Außerdem habe ich ein Leerzeichen zwischen cat und >> hinzugefügt, wie: "cat >> .ssh / authorized_keys"
cmcculloh
4
Dies beantwortet nicht die Frage, wie wir den Schlüssel angeben, wenn wir einen Git-Push-Befehl ausführen
psvj
27

Die hier aufgeführten Anweisungen waren für mich nützlicher.

Über den Link:

Passen Sie Ihre an ~/.ssh/configund fügen Sie hinzu:

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

Verwenden Sie nun den SSH-Host-Alias ​​als Repository:

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

Und es sollte den other_id_rsaSchlüssel benutzen !

TinyTimZamboni
quelle
2
Ich fand das auch nützlich git remote add ec2 ssh://[email protected]:zivot. Ich wusste vorher nicht, dass man Adressen voranstellen kann ssh://.
Isomorphismen
Tolle Antwort, ich hatte gehofft, die SSH-Konfiguration nutzen zu können, die ich bereits verwende.
Eric Wilson
Genial. Dies ist besser, als die vollständige URL herauszufinden.
Saifur Rahman Mohsin
20

Bearbeiten Sie auf Ihrem lokalen Computer Ihre ~ / .ssh / config und fügen Sie Folgendes hinzu:

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

Sie sollten sich mit "ssh example" bei Ihrer Instanz anmelden können. Denken Sie daran, dass Ihr privater Schlüssel chmod 400 sein sollte. Wenn Sie ohne Verwendung von "ssh -i mykey.pem Benutzername @ Host" ssh können, gehen Sie wie folgt vor.

Initialisieren Sie auf Ihrer EC2-Instanz ein nacktes Repository, das ausschließlich zum Pushen verwendet wird. Die Konvention besteht darin, die Erweiterung ".git" zum Ordnernamen hinzuzufügen. Dies kann anders aussehen als Ihr lokales Repo, das sich normalerweise als .git-Ordner in Ihrem "Projekt" -Ordner befindet. Bare Repositorys (per Definition) haben keinen funktionierenden Baum, sodass Sie ihnen nicht einfach Dateien hinzufügen können, wie Sie es in einem normalen nicht nackten Repository tun würden. Dies ist genau so, wie es gemacht wird. Auf Ihrer ec2-Instanz:

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

Verwenden Sie jetzt auf Ihrem lokalen Computer den SSH-Host-Alias, wenn Sie Ihre Fernbedienung einrichten.

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

Jetzt sollten Sie in der Lage sein:

git push ec2 master

Jetzt wird Ihr Code ohne Probleme auf den Server übertragen. Das Problem an dieser Stelle ist jedoch, dass Ihr WWW-Ordner auf der ec2-Instanz nicht die tatsächlichen "Arbeitsdateien" enthält, die Ihr Webserver ausführen muss. Sie müssen also ein "Hook" -Skript einrichten, das ausgeführt wird, wenn Sie auf ec2 pushen. Dieses Skript füllt den entsprechenden Ordner auf Ihrer ec2-Instanz mit Ihren tatsächlichen Projektdateien.

Wechseln Sie also auf Ihrer ec2-Instanz in Ihr Verzeichnis project_folder.git / hooks. Erstellen Sie dann eine Datei mit dem Namen "post-receive" und chmod 775 (sie muss ausführbar sein). Fügen Sie dann dieses Bash-Skript ein:

#!/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

Führen Sie nun auf Ihrem lokalen Computer einen "git push ec2 master" aus, der den Code auf Ihr nacktes Repo übertragen soll. Anschließend checkt das Post-Receive-Hook-Skript Ihre Dateien in den entsprechenden Ordner aus, für den Ihr Webserver konfiguriert ist.

devdrc
quelle
1
das funktioniert bei mir. die chmods sind sehr wichtig. @devdrc Möglicherweise müssen Sie es weiter bearbeiten und die Befehlszeilenanweisungen hervorheben.
Abel Callejo
Der Teil vor dem Bash-Skript hat großartig funktioniert, aber das Bash-Skript hat bei mir nicht funktioniert. Diese Antwort stackoverflow.com/a/24027870/847954 hat bei mir hervorragend funktioniert. Danke devdrc für diesen Beitrag und @blamb für das Posten des Skripts.
Jeff Moschus
@ Jeffmusk Sie müssen sicherstellen, dass die post-receiveDatei ausführbar ist
Abel Callejo
5

Sie müssen einen SSH-Schlüssel generieren und auf die EC2-Instanz hochladen. Folgen Sie diesem Tutorial: http://alestic.com/2010/10/ec2-ssh-keys

Jon
quelle
2
Ich habe jedoch bereits den privaten Schlüssel-Wert-Paar-Schlüssel bei mir, mit dem ich mich bei EC2 angemeldet habe.
Zengr
Probieren Sie einige der Lösungen in diesem Thread aus: serverfault.com/questions/39733/…
Jon
2
Ich verstehe diesen Teil, aber dies ist ein Git-Konfigurationsproblem.
Zengr
Ich sehe nichts falsches an Ihrer Konfiguration, daher glaube ich, dass etwas mit Ihren SSH-Schlüsseln nicht stimmt, entweder verlegt oder was nicht - es wäre höchstwahrscheinlich das und nicht Ihre Konfiguration.
Jon
6
Wenn Sie Ihren Schlüssel auf einem ungeraden Pfad haben, führen Sie ihn einfach aus ssh-add /private/key/path.
Jon
4

Ich fand, dass dies der schnellste Weg war: https://gist.github.com/matthewoden/b29353e266c554e04be8ea2058bcc2a0

Grundsätzlich:

ssh-add /path/to/keypair.pem (das "-add" muss direkt nach dem ssh sein)

Überprüfen Sie, ob es funktioniert hat von: ssh ubuntu@crazylongAWSIP(Möglicherweise ist Ihr Benutzername nicht Ubuntu)

Danach können Sie ein Git-Repo auf Ihrem ec2 einrichten und darauf zugreifen:

git remote add origin [email protected]:/path/to/your/repo-name.git 
git config --global remote.origin.receivepack "git receive-pack" # needed for aws ec2 stuff.
git push origin master

Sie haben die Möglichkeit, ein "nacktes" Git-Repo auf Ihrem ec2 einzurichten (was bedeutet, dass andere Git-Repos daraus ziehen und darauf pushen können, aber keine Dateien enthalten), oder Sie können ein NORMAL-Repo und Push einrichten direkt darauf (meine Präferenz, wenn Sie lokale Änderungen an Ihrem ec2 vornehmen möchten, ohne ständig in Ihr ec2 ssh müssen).

Wenn Sie ein NORMAL-Repo auf dem ec2 einrichten möchten, ssh in das ec2, machen Sie ein git initwo Sie wollen, und machen Sie dann Folgendes :

git config receive.denyCurrentBranch updateInstead

Siehe: Kann nicht in das Git-Repository pushen, um zu erklären, dass der aktuelle Zweig verweigert wurde.

rikkitikkitumbo
quelle
2
  1. Führen Sie ssh-keygen vor Ort
  2. In Ihrem lokalen ~/.ssh/ Verzeichnis sollte jetzt eine Datei mit öffentlichem Schlüssel mit dem Namen " id_rsa.pubKopieren" angezeigt werden. Kopieren Sie die Inhalte dieser Datei in die /etc/ssh/authorized_keysDatei, die sich auf Ihrem Remote-Server befindet .

Sie können den Inhalt entweder kopieren und einfügen oder die Datei zuerst auf Ihren Remote-Server hochladen und den folgenden Befehl verwenden:

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

Alastair
quelle
1
Sind die Schritte 2 und 3 gleich?
JoeTidee
Nein, @JoeTidee - Schritt 2 bringt den Schlüssel auf den Remote-Server und Schritt 3 fügt ihn an der richtigen Stelle hinzu. :)
Alastair
1

Ich poste hier nichts Neues, denke ich, aber ich musste die obigen Antworten durchgehen, um meinen speziellen Fall anzusprechen. Ich habe eine Ubuntu-Instanz auf EC2.

Um mich bei meiner Instanz anzumelden, musste ich Folgendes tun:

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

Die Schlüsseldatei "pemfile.pem" musste in Anführungszeichen stehen.

Ich habe die Fernbedienung hinzugefügt:

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

Aber als ich versuchte zu pushen:

git push origin master

Ich habe:

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

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

Um das zu beheben, habe ich:

/<path to pemfile>/pemfile.pem

Was mir eine Antwort gab,

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

Danach ging der Schub gut durch.

guero64
quelle
5
Ich verstehe nicht, wenn Sie sagen "Um das zu beheben, was ich getan habe: / path to pemfile /" Meine pemfile.pem führt nichts aus ... Mit welchem ​​Befehl fügen Sie die Identität hinzu?
Rikkitikkitumbo
Bitte geben Sie an und schließen Sie Ihre Antwort mit dem Befehl ab, mit dem Sie den Schlüssel hinzugefügt haben.
Enginerd Sunio
0

Bei der Bereitstellung über die Quellcodeverwaltung wurde mir die Berechtigung verweigert , und ich konnte nicht herausfinden, warum. Ich stellte fest, dass mein Benutzer, für den ich einen SSH-Schlüssel erstellte (Ubuntu, auch die empfohlene Anmeldung für meinen ec2-Server), nicht der Benutzer war, der für die Cap-Bereitstellung (root) verantwortlich war. Das Ausführen eines ssh-keygen für root und das Hochladen dieses ssh-Schlüssels als Bereitstellungsschlüssel für bitbucket lösten meine Probleme.

Danny
quelle
0

Hier ist die EINFACHSTE Methode, die für mich hervorragend funktioniert hat ... Ich hatte Probleme beim Klonen eines Repositorys ... Es wurde der von mir erstellte SSH-Schlüssel nicht erkannt ... Anstatt Ihre Konfigurationsdatei und all das zu ändern, habe ich einfach REAL kopiert SSH-Schlüssel, mit dem versucht wurde, eine Verbindung herzustellen, und ich habe dies zu Bitbucket hinzugefügt ... hier ist der Befehl:

 sudo vi /root/.ssh/id_rsa.pub

Verwendete VI, um den REAL RSA-Schlüssel zu öffnen und den Inhalt zu kopieren und in bitbucket einzufügen ... Fertig!

rckehoe
quelle