Skip to content

Instantly share code, notes, and snippets.

@brahimmachkouri
Last active September 9, 2024 09:56
Show Gist options
  • Save brahimmachkouri/ae86f8b45641e5813f9f58e370967ade to your computer and use it in GitHub Desktop.
Save brahimmachkouri/ae86f8b45641e5813f9f58e370967ade to your computer and use it in GitHub Desktop.
Inject ssh public key into multipass vm

Example of usage :

./inject_pubkey.sh myvmname
#!/bin/bash
# Ajoute une config SSH pour une connexion simplifiée :
# ssh <NOM_VM_MULTIPASS>
# Vérifie si un argument a été passé au script (le nom de l'instance)
if [ $# -eq 0 ]; then
echo "I need the instance name :"
multipass ls # Liste toutes les instances disponibles pour aider l'utilisateur à choisir
exit 1 # Sort du script si aucun nom d'instance n'est fourni
fi
# Stocke le nom de l'instance fourni dans une variable
VM_NAME=$1
# Nom de l'hôte SSH dans le fichier de configuration
HOST_ALIAS="$VM_NAME"
# Utilisateur SSH
SSH_USER="ubuntu"
# Fichier de configuration SSH
SSH_CONFIG_FILE="$HOME/.ssh/config"
# Récupération de l'adresse IP de la VM
VM_IP=$(multipass info "$VM_NAME" | grep IPv4 | awk '{ print $2 }')
# Vérification si l'adresse IP a été récupérée
if [ -z "$VM_IP" ]; then
echo "Error: Unable to retrieve the IP address of VM '$VM_NAME'."
exit 1
fi
# Vérification si une entrée pour l'hôte existe déjà dans le fichier config
if grep -q "Host $HOST_ALIAS" "$SSH_CONFIG_FILE"; then
echo "Updating existing entry for $HOST_ALIAS in $SSH_CONFIG_FILE"
# Utiliser sed pour mettre à jour l'adresse IP
sed -i "/Host $HOST_ALIAS/,/Host /{s/Hostname .*/Hostname $VM_IP/}" "$SSH_CONFIG_FILE"
else
echo "Adding new entry for $HOST_ALIAS in $SSH_CONFIG_FILE"
# Ajouter une nouvelle entrée à la fin du fichier
echo -e "\nHost $HOST_ALIAS\n\tHostname $VM_IP\n\tUser $SSH_USER" >> "$SSH_CONFIG_FILE"
fi
echo "SSH configuration updated for $HOST_ALIAS with IP address $VM_IP."
#!/bin/bash
# Injecte une clé publique dans la VM Multipass
# Vérifie si un argument a été passé au script (le nom de l'instance)
if [ $# -eq 0 ]; then
echo "I need the instance name :"
multipass ls # Liste toutes les instances disponibles pour aider l'utilisateur à choisir
exit 1 # Sort du script si aucun nom d'instance n'est fourni
fi
# Stocke le nom de l'instance fourni dans une variable
INSTANCE_NAME=$1
# Vérifie si la clé publique locale existe
if [ ! -f ~/.ssh/id_rsa.pub ]; then
echo "The file ~/.ssh/id_rsa.pub does not exist. Please generate an SSH key pair first."
exit 1 # Sort du script si la clé publique n'existe pas
fi
# Copie le fichier authorized_keys de l'instance vers le répertoire local
multipass copy-files $INSTANCE_NAME:/home/ubuntu/.ssh/authorized_keys . || {
echo "Failed to copy authorized_keys from the instance.";
exit 1; # Sort du script si la copie échoue
}
# Définit les permissions correctes pour le fichier authorized_keys local
chmod 600 authorized_keys
# Ajoute la clé publique locale au fichier authorized_keys
cat ~/.ssh/id_rsa.pub >> authorized_keys
# Copie le fichier authorized_keys mis à jour de nouveau dans l'instance
multipass copy-files authorized_keys $INSTANCE_NAME:/home/ubuntu/.ssh/authorized_keys || {
echo "Failed to copy authorized_keys to the instance.";
exit 1; # Sort du script si la copie échoue
}
# S'assure que les permissions sur le fichier authorized_keys dans l'instance sont correctes
multipass exec $INSTANCE_NAME -- chmod 600 /home/ubuntu/.ssh/authorized_keys || {
echo "Failed to set permissions on authorized_keys in the instance.";
exit 1; # Sort du script si l'exécution de la commande échoue
}
# Affiche le contenu du fichier authorized_keys dans l'instance pour vérification
echo "authorized_keys in the VM '$INSTANCE_NAME' are now :"
multipass exec $INSTANCE_NAME -- cat /home/ubuntu/.ssh/authorized_keys || {
echo "Failed to execute command on the instance.";
exit 1; # Sort du script si l'exécution de la commande échoue
}
# Supprime le fichier authorized_keys local pour nettoyage
rm authorized_keys
# Appelle le script add_ssh_config_entry.sh avec le nom de l'instance
./add_ssh_config_entry.sh $INSTANCE_NAME || {
echo "Failed to execute add_ssh_config_entry.sh.";
exit 1; # Sort du script si l'exécution de add_ssh_config_entry.sh échoue
}
echo "SSH key added and SSH config entry created successfully for instance '$INSTANCE_NAME'."
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment