# modified from https://github.com/paramiko/paramiko/blob/main/demos/interactive.py import socket import sys from paramiko.py3compat import u # windows does not have termios... try: import termios import tty has_termios = True except ImportError: has_termios = False def interactive_shell(chan): if has_termios: posix_shell(chan) else: windows_shell(chan) def posix_shell(chan): import select oldtty = termios.tcgetattr(sys.stdin) try: tty.setraw(sys.stdin.fileno()) tty.setcbreak(sys.stdin.fileno()) chan.settimeout(0.0) while True: r, w, e = select.select([chan, sys.stdin], [], []) if chan in r: try: x = u(chan.recv(1024)) if len(x) == 0: sys.stdout.write("\r\n*** EOF\r\n") break sys.stdout.write(x) sys.stdout.flush() except socket.timeout: pass if sys.stdin in r: x = sys.stdin.read(1) if len(x) == 0: break chan.send(x) finally: termios.tcsetattr(sys.stdin, termios.TCSADRAIN, oldtty) # thanks to Mike Looijmans for this code def windows_shell(chan): import threading sys.stdout.write( "Line-buffered terminal emulation. Press F6 or ^Z to send EOF.\r\n\r\n" ) global cmdout def writeall(sock): global cmdout line = 0 while True: data = sock.recv(256) if not data: sys.exit(0) cmdout = data.decode("utf-8") if "]$" in data.decode("utf-8"): line += 1 if line > 1: sys.stdout.write("press ENTER to continue\n") sys.stdout.write(cmdout) sys.stdout.flush() writer = threading.Thread(target=writeall, args=(chan,)) writer.start() try: chan.send("/homes/hyu3/anaconda3/envs/Documents/bin/python /homes/hyu3/Documents/dummy.py\n") # chan.send("vncpasswd\n") while True: if "]$" in cmdout: chan.send("exit\n") break d = sys.stdin.read(1) if not d: break chan.send(d) except (EOFError, OSError): # user hit ^Z or F6 pass