Last active
December 8, 2017 01:13
-
-
Save isaaguilar/e484d5c32fe45ec79ec723dcb3e617ed to your computer and use it in GitHub Desktop.
Use paramiko and create simple ssh and ssh-nat tunnel connection
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| from ssh_tunnel import SSH | |
| client = SSH("1.2.3.4", keyfile="/home/user/.ssh/id_rsa", username="user").client | |
| stdin, stdout, stderr = client.exec_command("hostname") | |
| for line in stdout.readlines(): | |
| print lines |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import paramiko | |
| class SSH(): | |
| def __init__(self, server_ip=None, nat_ip=None, | |
| keyfile=None, username=None, server_port=None, nat_port=None): | |
| self.server_ip = server_ip | |
| self.server_port = server_port if server_port else 22 | |
| self.nat_ip = nat_ip | |
| self.nat_port = nat_port if nat_port else 22 | |
| self.keyfile = keyfile | |
| self.username = username | |
| self.public_client = None | |
| self.private_client = None | |
| self.client = self.server_ssh() | |
| if self.nat_ip: | |
| self.client = self.tunnel_ssh() | |
| def get_client(self): | |
| p = paramiko.SSHClient() | |
| p.set_missing_host_key_policy(paramiko.AutoAddPolicy()) | |
| return p | |
| def server_ssh(self): | |
| client = self.get_client() | |
| # Nat or Server? | |
| public_ip = self.server_ip | |
| port = self.server_port | |
| if self.nat_ip: | |
| public_ip = self.nat_ip | |
| port = self.nat_port | |
| client.connect( | |
| public_ip, | |
| port, | |
| username=self.username, | |
| key_filename=self.keyfile, | |
| timeout=15) | |
| self.public_client = client | |
| return client | |
| def tunnel_ssh(self): | |
| destaddr = (self.server_ip, self.server_port) | |
| proxy_addr = ('127.0.0.1', 4445) | |
| transport = self.public_client.get_transport() | |
| channel = transport.open_channel("direct-tcpip", destaddr, proxy_addr) | |
| client = self.get_client() | |
| client.connect( | |
| 'localhost', | |
| 4445, | |
| username=self.username, | |
| key_filename=self.keyfile, | |
| sock=channel, | |
| timeout=15) | |
| self.private_client = client | |
| return client |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment