国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python獲取交互式ssh shell的方法

2020-02-16 01:07:34
字體:
來源:轉載
供稿:網友

更新,最近在學unix環境編程,了解一下進程的創建過程,用最原始的方式實現了一個ssh命令的執行。

#coding=utf8 '''用python實現了一個簡單的shell,了解進程創建類unix 環境下 fork和exec 兩個系統調用完成進程的創建''' import sys, os  def myspawn(cmdline): argv = cmdline.split() if len(argv) == 0:  return  program_file = argv[0] pid = os.fork() if pid < 0:  sys.stderr.write("fork error") elif pid == 0:  # child  os.execvp(program_file, argv)  sys.stderr.write("cannot exec: "+ cmdline)  sys.exit(127) # parent pid, status = os.waitpid(pid, 0) ret = status >> 8 # 返回值是一個16位的二進制數字,高8位為退出狀態碼,低8位為程序結束系統信號的編號 signal_num = status & 0x0F sys.stdout.write("ret: %s, signal: %s/n" % (ret, signal_num)) return ret  def ssh(host, user, port=22, password=None): if password:  sys.stdout.write("password is: '%s' , plz paste it into ssh/n" % (password)) cmdline = "ssh %s@%s -p %s " % (user, host, port) ret = myspawn(cmdline)  if __name__ == "__main__": host = '' user = '' password = '' ssh(host, user, password=password)

最近在做一個項目,需要在客戶端集成一個交互式ssh功能,大概就是客戶端跟服務器申請個可用的機器,服務端返回個ip,端口,密碼, 然后客戶端就可以直接登錄到機器上操做了。該程序基于paramiko模塊。

經查找,從paramiko的源碼包demos目錄下,可以看到交互式shell的實現,就是那個demo.py。但是用起來有些bug,于是我給修改了一下interactive.py(我把windows的代碼刪掉了,剩下的只能在linux下用)。代碼如下:

#coding=utf-8import socketimport sysimport osimport termiosimport ttyimport fcntlimport signalimport structimport select now_channel = None def interactive_shell(chan): posix_shell(chan)  def ioctl_GWINSZ(fd): try:  cr = struct.unpack('hh', fcntl.ioctl(fd, termios.TIOCGWINSZ,'aaaa')) except:  return return cr  def getTerminalSize(): cr = ioctl_GWINSZ(0) or ioctl_GWINSZ(1) or ioctl_GWINSZ(2) return int(cr[1]), int(cr[0])  def resize_pty(signum=0, frame=0): width, height = getTerminalSize() if now_channel is not None:  now_channel.resize_pty(width=width, height=height)   def posix_shell(chan): global now_channel now_channel = chan resize_pty() signal.signal(signal.SIGWINCH, resize_pty) # 終端大小改變時,修改pty終端大小 stdin = os.fdopen(sys.stdin.fileno(), 'r', 0) # stdin buff置為空,否則粘貼多字節或者按方向鍵的時候顯示不正確 fd = stdin.fileno() oldtty = termios.tcgetattr(fd) newtty = termios.tcgetattr(fd) newtty[3] = newtty[3] | termios.ICANON try:  termios.tcsetattr(fd, termios.TCSANOW, newtty)  tty.setraw(fd)  tty.setcbreak(fd)  chan.settimeout(0.0)  while True:   try:    r, w, e = select.select([chan, stdin], [], [])   except:    # 解決SIGWINCH信號將休眠的select系統調用喚醒引發的系統中斷,忽略中斷重新調用解決。    continue   if chan in r:    try:     x = chan.recv(1024)     if len(x) == 0:      print 'rn*** EOFrn',      break     sys.stdout.write(x)     sys.stdout.flush()    except socket.timeout:     pass   if stdin in r:    x = stdin.read(1)    if len(x) == 0:     break    chan.send(x) finally:  termios.tcsetattr(sys.stdin, termios.TCSADRAIN, oldtty)            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 五台县| 兴和县| 新泰市| 米泉市| 洪泽县| 宜君县| 海阳市| 崇州市| 贵南县| 隆尧县| 安福县| 勐海县| 腾冲县| 马关县| 项城市| 肇州县| 潜山县| 石嘴山市| 天津市| 潼南县| 崇明县| 砚山县| 行唐县| 临沂市| 青阳县| 西平县| 柳河县| 灌云县| 定州市| 云龙县| 内黄县| 门头沟区| 永胜县| 泰州市| 尚义县| 淮南市| 福清市| 泰宁县| 淮南市| 北京市| 荃湾区|