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