zoukankan      html  css  js  c++  java
  • Python编写的ssh客户端[类似putty]

    转载请注明出处:http://blog.csdn.net/jmppok/article/details/17588381

    windows下可以通过putty以ssh方式连接linux主机。但putty也有一些问题:比如没有保存session,乱码等等。

    偶然发现Python也有ssh模块,学习的同时尝试使用python编写一个类似putty的ssh客户端。

    1.环境准备

    python2.7 + PyCrypto + paramiko + ecdsa

    后面三个是python的扩展模块,实现了ssh连接功能。

    需要分别下载这三个模块,安装。

    PyCrypto下载地址:https://www.dlitz.net/software/pycrypto/

    paramiko下载地址:http://www.lag.net/paramiko/

    edssa下载地址:https://pypi.python.org/pypi/ecdsa/0.9

    安装十分简单,进入模块根目录执行 python setup.py build install命令即可。

    说明:linux下可按此安装。windows下我未编译通过,可使用编译好的版本,直接拷贝至Libsite-packages下即可。

    下面是一个windows下编译好的版本:win7下编译好的python ssh模块

    2.原理

    1)通过paramiko的ssh模块连接指定主机;

    2) 通过SSHClient.exec_command在远程主机上执行命令;

    3)通过exec_command返回的stdout,stdin,stderr进行交互;

    4)保存成功连接的主机信息(session),可以通过ls命令查看, session id命令,直接启动新连接;

    5)可在windows和linux下运行,写程序时需要注意他们的差别。

    3.代码ssh.py

    #!/usr/bin/python
    # -*- coding: utf-8 -*-
     
    import os,sys
    import paramiko  
    import threading  
    import platform
     
    curr_ssh = None	
    curr_prompt = ">>"
     
    #使用说明		
    def printUsage():
    	print "    !ls                     :list sessions."
    	print "    !session id             :connect session."
    	print "    !conn host user password:connect host with user."
    	print "    !exit                   :exit."
     
    #连接	
    def conn(ip,username,passwd):
    	try:
    		ssh = paramiko.SSHClient()  
    		ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())  
    		ssh.connect(ip,22,username,passwd,timeout=5)  
    		print "Connect to ",ip," with ",username
    		global curr_prompt
    		curr_prompt=username+"@"+ip+">>"
    		return ssh
    	except:
    		return None
    		
    #加载以前的连接信息
    sessions=[]
    def loadSessions():
    	global sessions
    	try:
    		f = open("sessions")
    		sessions = f.readlines()
    		f.close()
    	except:
    		pass
     
    #执行本地命令,ssh.py的命令		
    def exe_cmd_local(cmd):
    	if(cmd == "!ls"):
    		loadSessions()
    		global sessions
    		i=0
    		print "Sessions:"
    		for s in sessions:
    			print"[%d] %s" %(i,s)
    			i+=1
    	else:
    		vals = cmd.split(' ')
    		if(vals[0]=="!session"):
    			id = (int)(vals[1])
    			if(id<len(sessions)):
    				os_name = platform.system()
    				
    				new_console_cmd = ""
    				if(os_name == "Linux"):
    					new_console_cmd="gnome-terminal -e "./ssh.py " + sessions[id]+"""
    				elif(os_name == "Windows"):
    					new_console_cmd="start ssh.py " + sessions[id]
    				os.system(new_console_cmd)
    			else:
    				print "Didn't hava sessoin ",vals[1]
    		elif(vals[0]=="!conn"):
    			global curr_ssh
    			curr_ssh = conn(vals[1],vals[2],vals[3])
    			f = open("sessions","a")
    			line = vals[1]+" "+vals[2]+" "+vals[3]+"
    "
    			f.write(line)
    			f.close()
     
    #在ssh连接的主机上执行命令			
    def exe_cmd_ssh(ssh,cmd):
    	if(ssh == None):
    		print "Didn't connect to a server. Use '!conn' to connect please."
    		return
    	stdin, stdout, stderr = ssh.exec_command(cmd)  
    	#stdin.write("Y")   #简单交互,输入 ‘Y’   
    	#屏幕输出  
    	print stdout.read()
    	print stderr.read()
    		
    #入口函数
    if __name__=='__main__':
    	loadSessions()
    	if(len(sys.argv)==4):
    		curr_ssh = conn(sys.argv[1],sys.argv[2],sys.argv[3])
    	else:
    		printUsage()
    	while True:
    		cmd = raw_input(curr_prompt)
    		if(len(cmd)==0):
    			continue
    		
    		if(cmd == "!exit"):
    			if(curr_ssh != None):
    				curr_ssh.close();
    			break
    		else:
    			if(cmd[0] == '!'):
    				exe_cmd_local(cmd)
    			else:
    				exe_cmd_ssh(curr_ssh,cmd)
    

      

    4.使用

    可以直接ssh.py,进入主菜单:

    通过!conn   host  usrname  passwd连接:

    也可以ssh.py  host  usrname  passwd,直接连接指定的客户机。

    可以通过!ls 查看保存的Session列表:

    通过!session id 直接启动新窗口并连接:

    通过!exit退出。

    连接后可远程执行shell 命令:

    5.问题

    1)部分ssh命令无法执行;

    2)界面显示太弱,需要改进。

  • 相关阅读:
    Zjnu Stadium(hdu3047带权并查集)
    cocos2d-x结合cocosbuilder,不同屏幕适配小结
    分布式爬虫系统设计、实现与实战:爬取京东、苏宁易购全网手机商品数据+MySQL、HBase存储
    Generating RSA keys in PKCS#1 format in Java--转
    nodejs安装node-rsa遇到的问题及解决
    spring-redis-data的一个坑
    node-rsa加密,java解密调试
    MySQL 四种事务隔离级别详解及对比--转
    从实际案例聊聊Java应用的GC优化--转
    动态可缓存的内容管理系统(CMS)
  • 原文地址:https://www.cnblogs.com/anita-harbour/p/9298034.html
Copyright © 2011-2022 走看看