[421] | 1 | #!/usr/bin/env python
|
---|
| 2 | import socket, pexpect, ANSI
|
---|
| 3 | import time, sys, os
|
---|
| 4 |
|
---|
| 5 | # Clearly having the password on the command line is not a good idea, but
|
---|
| 6 | # then this entire enterprise is probably not the most security concious thing
|
---|
| 7 | # I've ever built. This should be considered an experimental tool.
|
---|
| 8 | # USER = sys.argv[1]
|
---|
| 9 | # PASSWORD = sys.argv[2]
|
---|
| 10 | # PORT = sys.argv[3]
|
---|
| 11 |
|
---|
| 12 | def daemonize (stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'):
|
---|
| 13 | '''This forks the current process into a daemon.
|
---|
| 14 | Almost none of this is necessary (or advisable) if your daemon
|
---|
| 15 | is being started by inetd. In that case, stdin, stdout and stderr are
|
---|
| 16 | all set up for you to refer to the network connection, and the fork()s
|
---|
| 17 | and session manipulation should not be done (to avoid confusing inetd).
|
---|
| 18 | Only the chdir() and umask() steps remain as useful.
|
---|
| 19 |
|
---|
| 20 | References:
|
---|
| 21 | UNIX Programming FAQ
|
---|
| 22 | 1.7 How do I get my program to act like a daemon?
|
---|
| 23 | http://www.erlenstar.demon.co.uk/unix/faq_2.html#SEC16
|
---|
| 24 |
|
---|
| 25 | Advanced Programming in the Unix Environment
|
---|
| 26 | W. Richard Stevens, 1992, Addison-Wesley, ISBN 0-201-56317-7.
|
---|
| 27 |
|
---|
| 28 | The stdin, stdout, and stderr arguments are file names that
|
---|
| 29 | will be opened and be used to replace the standard file descriptors
|
---|
| 30 | in sys.stdin, sys.stdout, and sys.stderr.
|
---|
| 31 | These arguments are optional and default to /dev/null.
|
---|
| 32 | Note that stderr is opened unbuffered, so
|
---|
| 33 | if it shares a file with stdout then interleaved output
|
---|
| 34 | may not appear in the order that you expect.
|
---|
| 35 | '''
|
---|
| 36 |
|
---|
| 37 | # Do first fork.
|
---|
| 38 | try:
|
---|
| 39 | pid = os.fork()
|
---|
| 40 | if pid > 0:
|
---|
| 41 | sys.exit(0) # Exit first parent.
|
---|
| 42 | except OSError, e:
|
---|
| 43 | sys.stderr.write ("fork #1 failed: (%d) %s\n" % (e.errno, e.strerror) )
|
---|
| 44 | sys.exit(1)
|
---|
| 45 |
|
---|
| 46 | # Decouple from parent environment.
|
---|
| 47 | os.chdir("/")
|
---|
| 48 | os.umask(0)
|
---|
| 49 | os.setsid()
|
---|
| 50 |
|
---|
| 51 | # Do second fork.
|
---|
| 52 | try:
|
---|
| 53 | pid = os.fork()
|
---|
| 54 | if pid > 0:
|
---|
| 55 | sys.exit(0) # Exit second parent.
|
---|
| 56 | except OSError, e:
|
---|
| 57 | sys.stderr.write ("fork #2 failed: (%d) %s\n" % (e.errno, e.strerror) )
|
---|
| 58 | sys.exit(1)
|
---|
| 59 |
|
---|
| 60 | # Now I am a daemon!
|
---|
| 61 |
|
---|
| 62 | # Redirect standard file descriptors.
|
---|
| 63 | si = open(stdin, 'r')
|
---|
| 64 | so = open(stdout, 'a+')
|
---|
| 65 | se = open(stderr, 'a+', 0)
|
---|
| 66 | os.dup2(si.fileno(), sys.stdin.fileno())
|
---|
| 67 | os.dup2(so.fileno(), sys.stdout.fileno())
|
---|
| 68 | os.dup2(se.fileno(), sys.stderr.fileno())
|
---|
| 69 |
|
---|
| 70 | # I now return as the daemon
|
---|
| 71 | return 0
|
---|
| 72 |
|
---|
| 73 | def main ():
|
---|
| 74 | USER = sys.argv[1]
|
---|
| 75 | PASSWORD = sys.argv[2]
|
---|
| 76 | PORT = int(sys.argv[3])
|
---|
| 77 |
|
---|
| 78 | #daemonize ()
|
---|
| 79 | #daemonize('/dev/null','/tmp/daemon.log','/tmp/daemon.log')
|
---|
| 80 |
|
---|
| 81 | sys.stdout.write ('Daemon started with pid %d\n' % os.getpid() )
|
---|
| 82 |
|
---|
| 83 | vs = ANSI.ANSI (24,80)
|
---|
| 84 | p = pexpect.spawn ('ssh %(USER)s@localhost'%locals(), timeout=9)
|
---|
| 85 | p.expect ('assword')
|
---|
| 86 | p.sendline (PASSWORD)
|
---|
| 87 | time.sleep (0.2)
|
---|
| 88 | #p.sendline ('stty -echo')
|
---|
| 89 | #time.sleep (0.2)
|
---|
| 90 | p.sendline ('export PS1="HAON "')
|
---|
| 91 | time.sleep (0.2)
|
---|
| 92 | p.expect (pexpect.TIMEOUT)
|
---|
| 93 | print p.before
|
---|
| 94 | vs.process (p.before)
|
---|
| 95 | HOST = '' # Symbolic name meaning the local host
|
---|
| 96 | s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
---|
| 97 | s.bind((HOST, PORT))
|
---|
| 98 | print 'Listen'
|
---|
| 99 | s.listen(1)
|
---|
| 100 | print 'Accept'
|
---|
| 101 | while 1:
|
---|
| 102 | conn, addr = s.accept()
|
---|
| 103 | print 'Connected by', addr
|
---|
| 104 | data = conn.recv(1024)
|
---|
| 105 | print data
|
---|
| 106 |
|
---|
| 107 | if data == 'exit':
|
---|
| 108 | p.sendline (exit)
|
---|
| 109 | break
|
---|
| 110 | if not data == "pass":
|
---|
| 111 | p.sendline (data)
|
---|
| 112 | time.sleep (0.1)
|
---|
| 113 | p.expect (['HAON ',pexpect.TIMEOUT])
|
---|
| 114 | #response = p.before
|
---|
| 115 | sh_response = p.before.replace ('\r', '')
|
---|
| 116 | vs.process_list (sh_response)
|
---|
| 117 | response = str (vs)
|
---|
| 118 | print response
|
---|
| 119 | sent = conn.send(response)
|
---|
| 120 | if sent < len (response):
|
---|
| 121 | print "Sent is too short"
|
---|
| 122 |
|
---|
| 123 |
|
---|
| 124 | if __name__ == "__main__":
|
---|
| 125 | # daemonize('/dev/null','/tmp/daemon.log','/tmp/daemon.log')
|
---|
| 126 | main()
|
---|
| 127 |
|
---|
| 128 |
|
---|
| 129 |
|
---|