telnet from ssh tunnel - Printable Version +- Python Forum (https://python-forum.io) +-- Forum: Python Coding (https://python-forum.io/forum-7.html) +--- Forum: Networking (https://python-forum.io/forum-12.html) +--- Thread: telnet from ssh tunnel (/thread-20426.html) |
telnet from ssh tunnel - oldfart - Aug-10-2019 Trying to get data (mainly temperature) from a UniFi Switch 16 POE-150W. Have to first enter the switch with ssh, then telnet into the local host, then issue a "show env" command. I am having problems getting a return of data after the telnet command. Here's how far I got: ##first install pexpect .. pip install pexpect from pexpect import pxssh import getpass import time import sys import subprocess try: s = pxssh.pxssh() hostname = '192.168.1.7' username = 'u-name' password = 'p-word' s.login(hostname, username, password) #just to prove we are logged into ssh tunnel s.sendline('ls') s.prompt() print(s.before) # telnet into the switch s.sendline('telnet localhost') time.sleep(.5) # just wait a bit print(sys.stdout) #does not work # for line in sys.stdout: # print(line) #this is the command to get temperature and other data s.sendline('show env\n') print(sys.stdout) s.logout() except pxssh.ExceptionPxssh as e: print("pxssh failed on login.") print(e) RE: telnet from ssh tunnel - DeaD_EyE - Aug-10-2019 Paramiko could do this. To understand it, you have to read the documentation. This is a minimal interactive example. The source-address is ('127.0.0.1', 0) . The port 0 should take any free port for the client.The desination-address is the second argument of the open_channel method.This defines where the server should connect. If the switch is on the same host, then 127.0.0.1. If this is not the case, for example the switch is somewhere in your network with his own ip, you must change the destination address to the switch-ip. import telnetlib import sys from contextlib import contextmanager from argparse import ArgumentParser from getpass import getpass from paramiko import ( SSHClient, MissingHostKeyPolicy, ) @contextmanager def make_tunnel(ssh_user, ssh_password, ssh_host, ssh_port, dst_ip, dst_port): client = SSHClient() client.set_missing_host_key_policy(MissingHostKeyPolicy()) client.connect(hostname=ssh_host, username=ssh_user, password=ssh_password, port=ssh_port) transport = client.get_transport() tunnel = transport.open_channel('direct-tcpip', (dst_ip, dst_port), ('127.0.0.1', 0)) yield tunnel tunnel.close() client.close() if __name__ == '__main__': parser = ArgumentParser() parser.add_argument('ssh_user', type=str) parser.add_argument('ssh_host', type=str) parser.add_argument('dst_ip', type=str) parser.add_argument('dst_port', type=int) parser.add_argument('--ssh_port', type=int, default=22) args = parser.parse_args() password = getpass('Please enter the password: ') try: with make_tunnel(ssh_password=password, **vars(args)) as channel: tn = telnetlib.Telnet() # instead of connecting with telnet # reuse the already open socket served # by ssh tn.sock = channel tn.interact() except KeyboardInterrupt: print('Got KeyboardInterrupt, shutting down graceful') except Exception as e: print('Error:', e) sys.exit(1)The telnet-client's sock object is assigned to the open channel. The telnetlib is using the already open connection. The interact method helps to check if the connections works and if the device accepts commands. The argumentparser makes it more flexible. RE: telnet from ssh tunnel - venquessa - Sep-02-2019 Would SNMP not be a better option for this? Chances are if you run an snmpwalk against it's top level you will find the temperature in a MIB somewhere. Wrapping this in some python is easy. Here is a super simple example of reading a list of data from SNMP. I'm sure you can adapt it. https://gitlab.com/paulcam/home_heating/blob/master/scheduler/snmp.py This might also help: https://community.ui.com/questions/SNMP-temp-data-for-small-switch-devices/02ad566e-dac4-4fc3-9715-f6d1438c2898 RE: telnet from ssh tunnel - noobami99 - Jul-17-2020 how to send the command like "show env" to the device after we login via telnet?? |