| 4094 | |
| 4095 | class ThreadedTCPRequestHandler(socketserver.BaseRequestHandler): |
| 4096 | def handle(self): |
| 4097 | |
| 4098 | self.request.setblocking(False) |
| 4099 | stdin_stream = session.new_streamID |
| 4100 | stdout_stream = session.new_streamID |
| 4101 | stderr_stream = session.new_streamID |
| 4102 | |
| 4103 | if not all([stdin_stream, stdout_stream, stderr_stream]): |
| 4104 | return |
| 4105 | |
| 4106 | code = rf""" |
| 4107 | import socket |
| 4108 | client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) |
| 4109 | frlist = [stdin_stream] |
| 4110 | connected = False |
| 4111 | while True: |
| 4112 | readables, _, _ = select(frlist, [], []) |
| 4113 | |
| 4114 | for readable in readables: |
| 4115 | if readable is stdin_stream: |
| 4116 | data = stdin_stream.read({options.network_buffer_size}) |
| 4117 | if not connected: |
| 4118 | client.connect(("{rhost}", {rport})) |
| 4119 | client.setblocking(False) |
| 4120 | frlist.append(client) |
| 4121 | connected = True |
| 4122 | try: |
| 4123 | client.sendall(data) |
| 4124 | except OSError: |
| 4125 | break |
| 4126 | if not data: |
| 4127 | frlist.remove(stdin_stream) |
| 4128 | break |
| 4129 | if readable is client: |
| 4130 | try: |
| 4131 | data = client.recv({options.network_buffer_size}) |
| 4132 | stdout_stream.write(data) |
| 4133 | if not data: |
| 4134 | frlist.remove(client) # TEMP |
| 4135 | break |
| 4136 | except OSError: |
| 4137 | frlist.remove(client) # TEMP |
| 4138 | break |
| 4139 | else: |
| 4140 | continue |
| 4141 | break |
| 4142 | #client.shutdown(socket.SHUT_RDWR) |
| 4143 | client.close() |
| 4144 | """ |
| 4145 | session.exec( |
| 4146 | code, |
| 4147 | python=True, |
| 4148 | stdin_stream=stdin_stream, |
| 4149 | stdout_stream=stdout_stream, |
| 4150 | stderr_stream=stderr_stream, |
| 4151 | stdin_src=self.request, |
| 4152 | stdout_dst=self.request, |
| 4153 | agent_control=control |