thank you in advance¨
Adrian
There are some other examples out there, some of which may work on Windows. They generally involve a “sleep” of some kind, though, so they won’t be quite as responsive. You basically have to trade off responsiveness for the higher power usage of waking up frequently. Here’s one example of this:Note that this uses the older Python 3.4 syntax and not the Python 3.5 syntax I used in my example. It could easily be adapted, though.
import asyncio, asyncssh, sys
async def run_client():
async with asyncssh.connect('xxxxxx',username='xxxxxx', password='xxxxx', client_keys=None, known_hosts = None ) as conn:
proc1 = await conn.create_process(r'echo "1\n2\n3"')
proc2_result = await conn.run('tail -r', stdin=proc1.stdout)
print(proc2_result.stdout, end='')
try:
asyncio.get_event_loop().run_until_complete(run_client())
except (OSError, asyncssh.Error) as exc:
sys.exit('SSH connection failed: ' + str(exc))
from tkinter import ttk
import tkinter
import asyncio
import asyncssh
class SSHFrame(tkinter.Frame):
def __init__(self, master=None):
super().__init__(master)
self._text = tkinter.Text(self, height= 60)
self._text.grid(row=0, column=0, sticky='nsew')
self.create_notebook()
asyncio.ensure_future(self._event_loop())
def create_notebook(self):
self.note = ttk.Notebook(self, name='notebook', width=500)
self.tab1 = tkinter.Frame(self.note)
self.tab2 = tkinter.Frame(self.note)
self.tab3 = tkinter.Frame(self.note)
self.tab4 = tkinter.Frame(self.note)
self.note.add(self.tab1, text="SSH")
self.note.add(self.tab2, text="a")
self.note.add(self.tab3, text="b")
self.note.add(self.tab4, text="c")
self.note.grid(row=0, column=1, sticky='n')
tkinter.Label(self.tab1, text="Server-IP:").grid(row=1, column=0, sticky='e')
tkinter.Label(self.tab1, text="User:").grid(row=2, column=0, sticky='e')
tkinter.Label(self.tab1, text="Password:").grid(row=3, column=0, sticky='ne')
self.server_ip = tkinter.Entry(self.tab1)
self.server_user = tkinter.Entry(self.tab1)
self.server_pwd = tkinter.Entry(self.tab1)
self.button_connect = tkinter.Button(self.tab1, text="Connect", fg="red")
self.button_disconnect = tkinter.Button(self.tab1, text="DisConnect", fg="red")
self.server_ip.grid(row=1, column=1, padx=2, pady=2, sticky='we', columnspan=9)
self.server_user.grid(row=2, column=1, padx=2, pady=2, sticky='we', columnspan=9)
self.server_pwd.grid(row=3, column=1, padx=2, pady=2, sticky='we', columnspan=9)
self.button_connect.grid(row=5, column=0, padx=2, pady=6, sticky='')
self.button_disconnect.grid(row=5, column=1, padx=2, pady=2, sticky='')
self.server_ip.insert(10, "server")
self.server_user.insert(10, "user")
async def _event_loop(self, interval=0.05):
try:
while True:
self.update()
await asyncio.sleep(interval)
except tkinter.TclError as exc:
if "application has been destroyed" in exc.args[0]:
self._proc.close()
else:
raise
def _handle_keypress(self, event):
self._proc.stdin.write(event.char)
return 'break'
async def run(self, host, command):
async with asyncssh.connect(host, username='xxxxxxxxx', password='xxxxxxxxxxx', client_keys=None, known_hosts = None ) as conn:
self._proc = await conn.create_process( term_type='dumb')
self._text.bind('<KeyPress>', self._handle_keypress)
while not self._proc.stdout.at_eof():
output = await self._proc.stdout.read(1024)
if output:
self._text.insert('end', output.replace('\r', ''))
self._text.see('end')
app = SSHFrame(tkinter.Tk())
app.grid(row=1, column=0)
asyncio.get_event_loop().run_until_complete(app.run('localhost'))