paramiko实现ssh的交互式连接

匿名 (未验证) 提交于 2019-12-03 00:22:01
利用python3+实现,命名为interactive.py
import socket import sys # 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 = chan.recv(1024)                     if len(x) == 0:                         print ('\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")     def writeall(sock):         while True:             data = sock.recv(256)             if not data:                 sys.stdout.write('\r\n*** EOF ***\r\n\r\n')                 sys.stdout.flush()                 break             sys.stdout.write(data.decode())             sys.stdout.flush()     writer = threading.Thread(target=writeall, args=(chan,))     writer.start()     try:         while True:             d = sys.stdin.read(1)             if not d:                 break             chan.send(d)     except EOFError:         # user hit ^Z or F6         pass

下面的文件命名为ssh_inter.py,需要在该文件相同的目录下建一个文件text。

import paramiko from uploadImg2linux import interactive #记录日志 paramiko.util.log_to_file('./test') #建立ssh连接 ssh=paramiko.SSHClient() ssh.load_system_host_keys() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect('210.30.97.233',port=22,username='fp',password='fp',compress=True) #建立交互式shell连接 channel=ssh.invoke_shell() #建立交互式管道 interactive.interactive_shell(channel) #关闭连接 channel.close() ssh.close()

实现的效果如下:,和利用xshell登陆到服务器端是一样的效果


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!