Skip to content

Instantly share code, notes, and snippets.

@isaaguilar
Last active December 8, 2017 01:13
Show Gist options
  • Select an option

  • Save isaaguilar/e484d5c32fe45ec79ec723dcb3e617ed to your computer and use it in GitHub Desktop.

Select an option

Save isaaguilar/e484d5c32fe45ec79ec723dcb3e617ed to your computer and use it in GitHub Desktop.
Use paramiko and create simple ssh and ssh-nat tunnel connection
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
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