Accédez à Github en spécifiant la clé SSH dans GitPython

J'avais besoin d'accéder au dépôt sur Github depuis le programme, j'ai donc utilisé GitPython. La plus grande partie a été résolue en regardant Tutoriel, mais elle a été décrite car il y avait une partie qui prenait un certain temps à fonctionner en spécifiant la clé SSH. Faire.

Spécifiez la clé SSH dans Git

Dans le cas sur lequel nous avons travaillé cette fois, les hypothèses et exigences suivantes existent.

Dans ce cas, cela dépend de l'environnement, donc cela ne peut pas être dit sans condition, mais dans de nombreux cas, il n'y a pas de problème pour accéder au référentiel du compte A. Le compte A est lié à la clé SSH par défaut (~ / .ssh / id_rsa), et Git utilise cette clé par défaut.

D'un autre côté, si vous utilisez le compte B, vous devez dire à Git d'utiliser ~ / .ssh / id_rsa_new. Une façon de faire est de définir ~ / .ssh / config sur:

~/.ssh/config


host github-new
  user git
  hostname github.com
  identityfile ~/.ssh/id_rsa_new
  identitiesonly yes

Vous pouvez ensuite utiliser la valeur spécifiée par host au lieu de github.com (spécifié par hostname) pour y accéder en utilisant ~ / .ssh / id_rsa_new.

~/.ssh/id_rsa_Cloner en utilisant un nouveau


$ git clone git@github-new:<AccountB>/<repository>.git

Cela convient si vous l'exécutez simplement dans votre propre environnement, mais que ce programme doit s'exécuter dans un environnement autre que le vôtre. Par conséquent, il est préférable de pouvoir le spécifier comme option d'exécution plutôt que de le définir.

Git a des variables d'environnement GIT_SSH et GIT_SSH_COMMAND ( GIT_SSH_COMMAND est 2.3 ou plus récent). Ceux-ci peuvent spécifier la commande SSH utilisée par Git. Vous pouvez résoudre le problème en spécifiant les mêmes options que le fichier de configuration ci-dessus dans la commande SSH à exécuter.

GIT_SSH,GIT_SSH_COMMAND


# GIT_SSH
$ GIT_SSH='~/ssh_cmd' git push origin master
$ cat ~/ssh_cmd
ssh -i ~/.ssh/id_rsa_new -oIdentitiesOnly=yes "$@"

# GIT_SSH_COMMAND
$ GIT_SSH_COMMAND='ssh -i ~/.ssh/id_rsa_new -oIdentitiesOnly=yes' git push origin master

(Référence) http://git-scm.com/docs/git#_other

Spécifiez la clé SSH dans GitPython

GitPython définit un gestionnaire de contexte qui prend en charge GIT_SSH, GIT_SSH_COMMAND.

(Référence) http://gitpython.readthedocs.org/en/stable/tutorial.html#handling-remotes

Je ne pouvais pas supposer que la version Git de l'environnement d'exécution était 2.3 ou supérieure, j'ai donc utilisé GIT_SSH cette fois. De plus, comme j'avais déjà le contenu de la clé SSH dans les paramètres, j'ai écrit la clé et la commande dans un fichier et je l'ai spécifié.

GIT avec Git Python_SSH,GIT_SSH_COMMAND


import git

#Exporter la clé SSH
with open('./id_rsa_tmp', 'w') as f:
    f.write('<SSH Key>')
    os.chmod('./id_rsa_tmp', 0o600)
#Exporter la commande SSH
with open('./ssh_cmd', 'w') as f:
    f.write('ssh -i ../id_rsa_tmp -oIdentitiesOnly=yes "$@"')
    os.chmod('./ssh_cmd', 0o777)

#Clone du référentiel
repo = git.Repo.clone_from('accountB_repo')

#Repository Push
ssh_executable = '../ssh_cmd'
with repo.git.custom_environment(GIT_SSH=ssh_executable):
    repo.remote().push('master')

Notez que lorsque vous exécutez repo.gitcustom_environment, vous vous trouvez dans le répertoire de travail du référentiel. Dans le code ci-dessus, le référentiel cloné (ʻaccountB_repo), la clé (ʻid_rsa_tmp) et la commande (ssh_cmd) sont dans le même répertoire. Lorsque repo.gitcustom_environment est exécuté, il se trouve dans le répertoire ʻaccountB_repo`, alors spécifiez la clé et la commande tout en sachant qu'elles sont dans le répertoire parent.

Spécification des touches et des commandes


with open('./ssh_cmd', 'w') as f:
    #La clé se trouve dans le répertoire parent
    f.write('ssh -i ../id_rsa_tmp -oIdentitiesOnly=yes "$@"')

#La commande se trouve dans le répertoire parent
ssh_executable = '../ssh_cmd'
with repo.git.custom_environment(GIT_SSH=ssh_executable):
...

Recommended Posts

Accédez à Github en spécifiant la clé SSH dans GitPython
Extrayez l'erreur de code d'état de la série 400500 du journal d'accès Apache en spécifiant la plage de temps
Accéder à l'API Twitter avec Python
Trier en spécifiant les conditions dans CASTable
Comment trier en spécifiant une colonne dans le tableau Python Numpy.
Installer en spécifiant la version avec pip
Lisez le fichier ligne par ligne avec Python
Lisez le fichier ligne par ligne avec Python
Lisez le fichier en spécifiant le code de caractère.
Technologie de gestion des mots de passe à l'ère GitHub
Importez en spécifiant directement le chemin du répertoire
Connectez-vous à un serveur distant avec SSH
Accéder aux fichiers dans le même répertoire que le fichier exécutable
Trier les éléments d'un tableau en spécifiant des conditions
Astuce BeautifulSoup: choisissez la balise en spécifiant le chemin
Faire de n'importe quelle clé la clé primaire dans le modèle Django
Rechercher par la valeur de l'instance dans la liste
Accédez aux variables définies dans le script depuis REPL