Source code for hpc05.ssh_utils

import os.path
import paramiko
from paramiko.ssh_exception import PasswordRequiredException, SSHException


[docs]def get_info_from_ssh_config(hostname): user_config_file = os.path.expanduser("~/.ssh/config") ssh_config = paramiko.SSHConfig() if os.path.exists(user_config_file): with open(user_config_file) as f: ssh_config.parse(f) cfg = ssh_config.lookup(hostname) full_hostname = cfg["hostname"] username = cfg["user"] proxy = ( paramiko.ProxyCommand(cfg["proxycommand"]) if "proxycommand" in cfg else None ) return username, full_hostname, proxy
[docs]def setup_ssh(hostname="hpc05", username=None, password=None): if username is None: try: username, hostname, proxy = get_info_from_ssh_config(hostname) except KeyError: raise Exception("hostname not in ~/.ssh/config, enter username") ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) try: ssh.connect( hostname, username=username, allow_agent=True, password=password, sock=proxy ) except (PasswordRequiredException, SSHException): msg = [ "Enter `password` argument or run", "rm -f ~/ssh-agent.socket; ssh-agent -a ~/ssh-agent.socket; " "export SSH_AUTH_SOCK=~/ssh-agent.socket; ssh-add", "on the local machine", ] raise Exception("\n".join(msg)) return ssh