Source code for codebots.utilities.ssh
import paramiko
import os
from pathlib import Path
[docs]def gen_keypair(ssh_folder=None, password=None):
"""Create a set of public and private keys and save them in the given
folder.
Parameters
----------
ssh_folder : str
folder where the keys are saved.
password : str
encrypt the private key with a password.
"""
if not ssh_folder:
ssh_folder = os.path.join(Path.home(), '.ssh')
key = paramiko.RSAKey.generate(4096)
with open(os.path.join(ssh_folder, "id_rsa.pub"), "w") as key_file:
key_file.write("ssh-rsa {}".format(key.get_base64()))
with open(os.path.join(ssh_folder, "id_rsa"), "w") as key_file:
key.write_private_key(key_file, password)
return "Key pair successfully generated in {}".format(ssh_folder)
[docs]def add_pubkey_to_server(bot, ssh_folder, os_type='linux'):
"""Adds the public key to the server's list.
Parameters
----------
bot : obj
`sshBot` object to access the server.
ssh_folder : str
folder where the keys are stored.
Warnings
--------
This works only on linux servers.
"""
with open(os.path.join(ssh_folder, 'id_rsa.pub'), "r") as pubkey_file:
pubkey = pubkey_file.readline()
bot.execute_cmds(commands=['(umask 077 && test -d ~/.ssh || mkdir ~/.ssh)',
'(umask 077 && touch ~/.ssh/authorized_keys)',
'echo {} >> ~/.ssh/authorized_keys'.format(pubkey)],
close_connection=False,
verbose=False)
return (f"public key successfully added. Try to run `ssh {bot.username}@{bot.hostname}`\n")