Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Port forwarding with Paramiko

Tags:

I'm trying to do some port forwarding from a python app using Paramiko. I can set up the SSH connection just fine, but I'm a bit stumped as to how to use paramiko.Transport. I've already found this file, but I can't work out what's going on in it. From looking at the paramiko.Transport docs, it seems that a single line using the open_channel function, but I can't work out how to implement that. I'm trying to replicate a simple ssh -L 8000:localhost:8000.

Can anyone help me out?

like image 795
TimD Avatar asked Jul 02 '12 13:07

TimD


People also ask

What can you do with paramiko?

Paramiko helps you automate repetitive system administration tasks on remote servers. More advanced Paramiko programs send the lines of a script one at a time. It does this rather than transacting all of a command, such as df or last , synchronously to completion.

Does paramiko use OpenSSH?

Paramiko does not itself leverage OpenSSH-style config file directives, but it does implement a parser for the format, which users can honor themselves (and is used by higher-level libraries, such as Fabric).


2 Answers

Please find some code using paramiko-1.7.7.1, pycrypto-2.6 and the forward.py script from which I did remove code from the line 115 to the end (to avoid options parsing).

import paramiko, sys from forward import forward_tunnel  remote_host = "target_host" remote_port = 8000 local_port  = 8000 ssh_host    = "my_ssh_host" ssh_port    = 22  user     = "login" password = "s3cr3t"  transport = paramiko.Transport((ssh_host, ssh_port))  # Command for paramiko-1.7.7.1 transport.connect(hostkey  = None,                   username = user,                   password = password,                   pkey     = None)  try:     forward_tunnel(local_port, remote_host, remote_port, transport) except KeyboardInterrupt:     print 'Port forwarding stopped.'     sys.exit(0) 

I've tested it successfully from a Windows station, using a ssh server under Red Hat and pointing to a 3rd server. (I'm using Python 2.7.2)

Hope it helps,

like image 189
Y__ Avatar answered Sep 16 '22 12:09

Y__


You can use https://github.com/pahaz/sshtunnel

pip install sshtunnel 

Code example:

import sshtunnel  with sshtunnel.open(     (ssh_host, ssh_port),     ssh_host_key=None,     ssh_username=ssh_user,     ssh_password=ssh_password,     ssh_private_key=None,     remote_bind_address=(REMOTE_HOST, REMOTE_PORT)) as server:      def do_something(port):         # Do something with port         pass      print("LOCAL PORT:", server.local_bind_port)      do_something(server.local_bind_port) 
like image 26
pahaz Avatar answered Sep 18 '22 12:09

pahaz