Re: [Twisted-Python] twisted python conch SSH shell?

conchClient.py is libarary. Running it from the command line was an afterthought just for testing. To run multiple commands in the same session you just give sshCmds a list of commands to run and it will return the output of all of them. Here is an example script that creates a function to up a port and another to return the wwn (this is from a SAN switch) of a port. #!/usr/bin/env python # Eli Criffield __version__ = 0.1186070837 __author__ = 'Eli Criffield <python AT zendo.net>' import sys import re import time import os from conchClient import sshCmds dryRun = False Confirm = True echo = False class reError(Exception): pass def execList(switch,cmds,change=False): global echo, dryRun, Confirm # if change is False, the commands arn't suppose to do any damage # always exec them, they need the info if not change: return sshCmds(switch,cmds,echo=echo) if dryRun: print 'DRY RUN' print 'ssh %s'%switch for cmd in cmds: print cmd print 'ENTER to continue:', sys.stdin.readline() return ('dryrun','') if Confirm: print "I'm going to run:" print '\nssh %s'%switch for cmd in cmds: print cmd ans = raw_input('Does that look ok (yes/no)? ') while ans.lower() not in ('yes', 'no'): ans = raw_input("Please type 'yes' or 'no': ") if ans == 'no': print 'exiting out' sys.exit(1) else: return sshCmds(switch,cmds,echo=echo) # No dryRun or Confirm just execute it return sshCmds(switch,cmds,echo=echo) def upPort(switch,port): cmds=[ 'config term', 'interface fc%s'%port, 'no shutdown' ,'end' ,'exit' ] execList(switch,cmds,change=True) def wwnFromPort(switch,port): portre = re.compile(r'%s '%port) linere = re.compile(r'(\S*)\s*(\S*)\s*(\S*)\s*(\S*)\s*(\S*)') (out,err) = execList(switch,['show flogi database']) for line in out.split('fc'): if portre.match(line): #print 'line:',line #DEBUG wwn = linere.match(line).groups()[3] #print wwn #DEBUG return wwn On Thu, Aug 21, 2008 at 2:07 AM, The Noob <thenoob06@gmail.com> wrote:
Hello,
If I understand your code, you can't find a way to run a real shell on Cisco ? For example if I connect to a router, I send a "sh log" , " conf t " commands but I do not know them before. With the actual script: conchClient.py 192.168.0.254 sh log The script disconnects us from the router conchClient.py 192.168.0.254 conf t The script disconnects us disconnect from the router I think the problem with your script it is for each command you are disconnected The best will be to find a solution to do this: conchClient.py 192.168.0.254 sh log conchClient.py 192.168.0.254 conf t conchClient.py 192.168.0.254 exit disconnect from server
I try to do this with a custom ssh server which permits to connect to others ssh servers and have a shell. But I don't know how to communicate between my custom ssh server and my child ( an expect script which launch ssh root@host and permits to have a real shell)
Best Regards TheNoob06
2008/8/21 Eli Criffield <elicriffield@gmail.com>
check out
http://twistedmatrix.com/pipermail/twisted-python/2007-July/015793.html
Eli Criffield
On Tue, Aug 12, 2008 at 3:40 PM, Bill Zeller <wzeller@cs.princeton.edu> wrote:
Hi,
I've been playing around with Twisted's Conch client (which looks extremely well done, thanks!). I've been able to connect to a conch server and also connect to other ssh servers and execuate various commands. I'd like to be able to connect to an arbitrary SSH server and run /bin/bash.
I'm able to execute a command like so:
--------------------- class CommandChannel(channel.SSHChannel): .... def channelOpen(self, data): self.conn.sendRequest( self, 'exec', common.NS(self.command), wantReply=True).addCallback( self._gotResponse) ---------------------
Looking through the SSH spec (connect protocol, rfc4254), it looks like shells are opened with this command.
---------------------
byte SSH_MSG_CHANNEL_REQUEST
uint32 recipient channel string "shell" boolean want reply
---------------------
It doesn't look like Conch supports these requests (here's how CHANNEL_REQUESTs are currently sent out)
--------------------- (Twisted-8.1.0) twisted/conch/ssh/connection.py (413): self.transport.sendPacket(MSG_CHANNEL_REQUEST, struct.pack('>L',
self.channelsToRemoteChannel[channel]) + common.NS(requestType)+chr(wantReply) + data) ---------------------
I may be misunderstanding how remote shells are started, so any help would be appreciated.
Again, I'm trying to launch an interactive /bin/bash shell from a Conch SSH client on an arbitrary remote SSH server.
Thanks for your time.
Best Regards, Bill Zeller
_______________________________________________ Twisted-Python mailing list Twisted-Python@twistedmatrix.com http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python
_______________________________________________ Twisted-Python mailing list Twisted-Python@twistedmatrix.com http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python
participants (1)
-
Eli Criffield