how to connect to a remote machine using python........

Shane Geiger sgeiger at ncee.net
Mon Dec 31 00:31:09 EST 2007


Some python ssh packages are available if you are wanting to execute
commands on a machine that has ssh.  ssh servers are available for
windows, but they aren't necessarily so well supported.

Here's a simple approach that works on ssh servers:

import commands
hostname = commands.getoutput('ssh you at remote.server.com  hostname')
print hostname

Alternatively, you could run a Python-based web server from a simple
script like the one below, allowing you to execute a few commands
anonymously.  This is the sort of thing you might and to do on LANs for
a windows computer you don't want to run SSH on. 



"""
This is a small Web server that will allow remote clients to run
commands on this server and get the output.

Usage:  python <thisscript>

Client Usage:
lynx http://localhost:8000/hostname

On Windows this can be installed as a service with WinServ:  winserv
install py_http_serv C:\Python23\python.exe C:\_admin\httpd_monitor.py
 - make sure that this service is set to restart the process if it fails


Things I could improve:  I could have it download a new dict of commands
which would have to be GPG signed.
  - I could add a feature that would allow it to give me it's public gpg
key...and I could encrypt messages for it.

Perhaps I could even have it push out a shell of some sort.

"""

import BaseHTTPServer, shutil, os
from cStringIO import StringIO
import os

class MyHTTPRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
    # HTTP paths we serve, and what commandline-commands we serve them with

    # Note: I could run smtp commands...and pop commands to verify that
the mail server is still working

    import os
    if os.name == 'nt':
        cmds = {
            '/ping': 'ping www.google.com',
            '/netstat' : 'netstat -a',
            '/tracert' : 'tracert www.thinkware.se',
            '/srvstats' : 'net statistics server',
            '/wsstats' : 'net statistics workstation',
            '/route' : 'route print',
        '/unlock_sgeiger' : 'net user sgeiger /active:yes',  # maybe I
should make that more cryptic
        '/lssvc' : 'lssvc.exe',  # list processes
        '/sclist' : 'sclist',    # list processes (resource kit)
        '/exchange_status' : 'lssvc | grep MSExch',
        '/diruse' : 'diruse',
        '/now' : 'now',
        '/uptime' : 'uptime',
        }
    elif os.name == 'posix':         # includes Mac, Linux
        cmds = {
            '/hostname' : 'hostname',
            '/ping': 'ping -c 3 www.google.com',
            '/netstat' : 'netstat -rn',
            '/tracert' : 'traceroute www.google.com',
            #'/srvstats' : 'net statistics server',
            #'/wsstats' : 'net statistics workstation',
            '/route' : 'route -rn',   # this might be different on the
mac...
        }


    def do_GET(self):
        """ Serve a GET request. """
        f = self.send_head()
        if f:
            f = StringIO()
            machine = os.popen('hostname').readlines()[0]
            if self.path == '/':
                heading = "Select a command to run on %s" % (machine)
                body = (self.getMenu() +
                    "<p>The screen won't update until the select "
                        "command has finished.  Please be patient.")
            else:
                heading = "Execution of ''%s'' on %s" %
(self.cmds[self.path], machine)
                cmd = self.cmds[self.path]
                body = '<a href="/">Main Menu</a><pre>%s</pre>\n' %
os.popen(cmd).read()
                # Translation CP437 -> Latin 1 needed for Swedish Windows.
                #body = body.decode('cp437').encode('latin1')
            f.write("<html><head><title>%s</title></head>\n" % heading)
            f.write("<body><h1>%s</h1>\n" % (heading))
            f.write(body)
            f.write("</body></html>\n")
            f.seek(0)
            self.copyfile(f, self.wfile)
            f.close()
        return f

    def do_HEAD(self):
        """ Serve a HEAD request. """
        f = self.send_head()
        if f:
            f.close()

    def send_head(self):
        path = self.path
        if not path in ['/'] + self.cmds.keys():
            head = 'Command "%s" not found.  Try one of these:<ul>' %path
            msg = head + self.getMenu()
            self.send_error(404, msg)
            return None
        self.send_response(200)
        self.send_header("Content-type", 'text/html')
        self.end_headers()
        f = StringIO()
        f.write("A test %s\n" % self.path)
        f.seek(0)
        return f

    def getMenu(self):
        keys = self.cmds.keys()
        keys.sort()
        msg = []
        for k in keys:
            msg.append('<li><a href="%s">%s => %s</a></li>' %(k, k,
self.cmds[k]))
        msg.append('</ul>')
        return "\n".join(msg)

    def copyfile(self, source, outputfile):
        shutil.copyfileobj(source, outputfile)

def main(HandlerClass = MyHTTPRequestHandler,
         ServerClass = BaseHTTPServer.HTTPServer):
    BaseHTTPServer.test(HandlerClass, ServerClass)

if __name__ == '__main__':
    main()



vinoj davis wrote:
> hi all,
>           i am new to python, can anyone tell me how can i connect to
> a remote machine using python and execute commands.
>
> Thanking you..........
>
> Regards,
>    
>      ---ViNOJ DAViS---
>
>
> ------------------------------------------------------------------------
> Chat on a cool, new interface. No download required. Click here.
> <http://in.rd.yahoo.com/tagline_webmessenger_10/*http://in.messenger.yahoo.com/webmessengerpromo.php>



-- 
Shane Geiger
IT Director
National Council on Economic Education
sgeiger at ncee.net  |  402-438-8958  |  http://www.ncee.net

Leading the Campaign for Economic and Financial Literacy




More information about the Python-list mailing list