DEV Community

HakamRaza
HakamRaza

Posted on • Updated on

[Linux] SSH to GitHub

Some intro

  • GitHub do provide option to use SSH to connect and do many things same as using the standard CLI.
  • And there are some functionalities offered by using SSH that make life easier, for example no need for token to pull your branch.
  • This is how to change your repo connection to use SSH. This is done in linux ubuntu OS.

GitHub connection types


Setting Up SSH keys and Permission

  • For this, you can use existing user or create a new user specifically for deployment/pull/push through SSH.
cd ~

# create .ssh folder inside user home directory
mkdir .ssh

# generate key private and public (.pub) using ssh-keygen, and give name like "github_dev".
# Optional, dont assign passphrase if you want to use it for CLI.
ssh-keygen -t ed25519-sk -C "your_email@example.com"

# check ssh agent running
eval $(ssh-agent -s)

# register only private key (no .pub) generated to ssh agent
ssh-add ~/.ssh/<private_key_file>
Enter fullscreen mode Exit fullscreen mode

  • for secure linux and current user to read private key to execute GitHub CLI, update the permission for access.
# change permission key file for read-only
cd ~/.ssh
chmod 644 <private_key>
sudo chgrp <username> <private_key>

# change permission to folder .ssh
cd ~
chmod 700 .ssh
sudo chgrp <username> .ssh

Enter fullscreen mode Exit fullscreen mode

  • you also can directly define any SSH connection to GitHub to use the private key generated by creating 'config' file
# config connection using ssh and correct key file
nano .ssh/config

# paste the following into the 'config' file
Host github.com
Hostname ssh.github.com
Port 443
User git
IdentityFile ~/.ssh/<private_key> #generated private key location
Enter fullscreen mode Exit fullscreen mode

Register public key generated to GitHub account.

Register public key at github account


Check Signature Github.

  • use the command below to cross check signature of the ssh agent is the same as displayed by GitHub
ssh-add -l -E sha256
Enter fullscreen mode Exit fullscreen mode

checking key's hash is the same


Testing GitHub SSH Connection

  • test successful connection through SSH to GitHub by:
# testing connection to github
ssh -T git@github.com

# testing with more details for troubleshooting
ssh -vT git@github.com
Enter fullscreen mode Exit fullscreen mode

Update Repository Remote URL

  • After successful connection through SSH, change current local repository remote to use SSH
  • usually the remote url is like this:
# Check connection profile setup
git remote -v

# result 
# origin  https://github.com/****.git (fetch)
# origin  https://github.com/****.git (push)
Enter fullscreen mode Exit fullscreen mode
  • you can either update original 'origin' or add new one like 'myssh'
  • the address can be refer back here: GitHub connection types
# add ssh connection profile 'myssh'
git remote add myssh ssh://git@****.git

# result 
# origin  https://github.com/****.git (fetch)
# origin  https://github.com/****.git (push)
# myssh     git@github.com:****.git (fetch)
# myssh     git@github.com:****.git (push)


# update existing connection profile 'origin' to use SSH
git remote set-url origin git@github.com:****.git

# result 
# origin     git@github.com:****.git (fetch)
# origin     git@github.com:****.git (push)

# update back to use HTTP
git remote set-url origin https://github.com/****.git
Enter fullscreen mode Exit fullscreen mode
  • example using GitHub CLI through SSH connection profile different than default 'origin'
# using 'myssh' connection profile
git checkout myssh/<branch name> -b <new branch name>
Enter fullscreen mode Exit fullscreen mode

User Connection Issue

  • There will be an issue sometimes with linux system user especially when using 'sudo'. In this case, the one executing CLI is not the current user but by the 'root' system user.
  • In this case, to maintain user profile, use '-E' flag:
sudo -E git fetch
Enter fullscreen mode Exit fullscreen mode

Bash Script

  • Example a bash script to pull the 'develop' branch.
  • The ssh-agent may need to be started again in linux.
#!/bin/bash

# start ssh-agent and register back private key
eval $(ssh-agent -s)
ssh-add ~/.ssh/<private_key_file>

# Go to project epo
cd /var/www/<local repository directory>

# Checkout 'develop' branch
git checkout develop

# Update connection profile
# git remote set-url origin git@github.com:*****.git

# Pull latest changes
git pull

# Checkout by latest tag
# git fetch --tags
# tag=$(git describe --tags `git rev-list --tags --max-count=1`)
# echo $tag
# git checkout $tag -b latest

# Set back to HTTP
# git remote set-url origin https://github.com/*****.git

#
# Additional steps
#

echo Done
Enter fullscreen mode Exit fullscreen mode

Top comments (0)