1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
import argparse
import os
import pty
import socket
import sys
class Client(object):
def __init__(self, host, port, username, password):
self.host = host
self.port = port
self.username = username
self.password = password
def run(self, argv):
sock = socket.socket()
sock.connect((self.host, self.port))
sock.send(self._build_connection_string().encode('utf-8'))
pty.spawn(argv, lambda fd: self._master_read(fd, sock))
def _master_read(self, fd, sock):
data = os.read(fd, 1024)
sock.send(data)
return data
def _build_connection_string(self):
auth = "hello %s %s\n" % (self.username, self.password)
metadata = '\033]499;{"geometry":[80,24]}\007' # XXX
return auth + metadata
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('--host', default="noway.ratry.ru")
parser.add_argument('--port', type=int, default=31337)
parser.add_argument('--username', default=os.getenv("USER"))
parser.add_argument('--password', default="asdf")
parser.add_argument(
'command',
nargs=argparse.REMAINDER,
)
args = parser.parse_args(sys.argv[1:])
client = Client(
host=args.host,
port=args.port,
username=args.username,
password=args.password,
)
command = args.command
if len(args.command) < 1:
command = os.getenv("SHELL", default="/bin/sh")
client.run(command)
|