Chinaunix首页 | 论坛 | 博客
  • 博客访问: 349731
  • 博文数量: 79
  • 博客积分: 3053
  • 博客等级: 中校
  • 技术积分: 861
  • 用 户 组: 普通用户
  • 注册时间: 2006-02-27 20:43
文章分类

全部博文(79)

文章存档

2012年(3)

2011年(21)

2010年(15)

2009年(40)

分类: Python/Ruby

2009-06-12 19:03:27

ubuntu下的ssh客户端一直没找到象SecureCRT那样好用的工具。用ssh登录,每次都要输入密码,感觉很麻烦,而且因为字符集不相同,一般还有乱码问题,所以参照网上的一些实现自己也通过python来实现了一下。 
#1.通过参数自动登录ssh远程服务器 
#2.通过配置字符集解决中文乱码问题 
#3.解决改变远程窗口默认较小bug,远程窗口同本地窗口大小动态改变未处理 
#4.实现2级代理 
#5.可以使用sftp登录来传文件(sftp,目前不能实现代理来作) 

配置文件host.properties 
第一列可以为id,第二列为用户名,第一列为密码,第四列为远程服务器字符集 

Java代码 
  1. #userid:user:password:characters  
  2. ljj51:ljj:123456:gbk  


登录脚本 

Python代码 
  1. #!/usr/bin/env python  
  2. #coding:UTF-8  
  3. #1.通过参数自动登录ssh远程服务器  
  4. #2.通过配置字符集解决中文乱码问题  
  5. #3.解决改变远程窗口默认较小bug,远程窗口同本地窗口大小动态改变未处理  
  6. #4.实现2级代理  
  7.   
  8. import os,sys,pexpect,string  
  9. import struct,fcntl,termios,signal  
  10.   
  11. try:  
  12.     import pexpect  
  13. except:  
  14.     print "你没有pexpect包,试试sudo apt-get install python-pexpect"  
  15.     sys.exit(0)  
  16.   
  17. def sigwinch_passthrough(sig,data):  
  18.     """窗口改动后,自动返回当前窗口值,以便跟远程窗口同步,目前有问题"""  
  19.     s=struct.pack("HHHH",0,0,0,0)  
  20.     a=struct.pack('hhhh',fcntl.ioctl(sys.stdout.fileno(),termios.TIOCGWINSZ,s))  
  21.   
  22.     #global columns,lines  
  23.     """ self.lines=a[0] 
  24.     self.columns=a[1] 
  25.     print "resize windows size(%s,%s)"%(self.lines,self.columns) 
  26.     """  
  27.     print a[0],a[1]  
  28.   
  29. class SimpleSsh:  
  30.     def __init__(self):  
  31.         self.columns=125  
  32.         self.lines=37  
  33.         self.base="~/ssh/"  
  34.         self.filename="host.properties"  
  35.   
  36.     def createSshUrl(self,paramap):  
  37.         user=paramap["user"]  
  38.         password=paramap["password"]  
  39.         host=paramap["host"]  
  40.         characters=paramap["characters"]  
  41.         conntype=paramap["conntype"]  
  42.         url="luit -encoding "+characters+" "+conntype+" "+user+"@"+host  
  43.   
  44.         print "#"*40  
  45.         print "#",string.center(string.join((user,"@",host," by ",characters),""),36),"#"  
  46.         print "#",string.center("created by lijunjieone@gmail.com",36),"#"  
  47.         print "#"*40  
  48.           
  49.         return url,password  
  50.   
  51.     def connection(self,url,password):  
  52.         """ """  
  53.         columns=self.columns  
  54.         lines=self.lines  
  55.         try:  
  56.             p=pexpect.spawn(url)  
  57.             try:  
  58.                 #signal.signal(signal.SIGWINCH,sigwinch_passthrough)  
  59.                 p.setwinsize(lines,columns)  
  60.                 print "resize windows(%s,%s)"%(columns,lines)  
  61.             except:  
  62.                 pass  
  63.             p.expect("password:")  
  64.             p.sendline(password)  
  65.             p.interact()  
  66.         except:  
  67.             print "connection close()"  
  68.       
  69.     def argv2map(self,userid,host,conntype):  
  70.         paramap={}  
  71.         base=self.base  
  72.         filename=self.filename  
  73.         tmp=""  
  74.         try:  
  75.             file=open(filename,"r")  
  76.         except:  
  77.             file=open(string.join(base,filename))  
  78.         content=file.readlines()  
  79.   
  80.         for x in content:  
  81.             if x.startswith(userid):  
  82.                 tmp=string.strip(x)  
  83.   
  84.         if tmp=="":  
  85.             print "not found %s"%userid  
  86.             sys.exit(0)  
  87.   
  88.         tmparray=string.split(tmp,":")  
  89.         paramap["user"]=tmparray[1]  
  90.         paramap["password"]=tmparray[2]  
  91.         paramap["userid"]=userid  
  92.         paramap["host"]=host  
  93.         paramap["characters"]=tmparray[3]  
  94.         paramap["conntype"]=conntype  
  95.   
  96.         return paramap  
  97.   
  98.     def initpara(self,para):  
  99.         try:  
  100.             userid=para[1]  
  101.             host=para[2]  
  102.             conntype=""  
  103.         except:  
  104.             userid=raw_input("enter your userid:")  
  105.             host=raw_input("enter your host:")  
  106.         try:  
  107.             conntype=para[3]  
  108.         except:  
  109.             conntype="ssh"  
  110.   
  111.         return userid,host,conntype  
  112.   
  113.       
  114.     def handle(self,para):  
  115.         userid,host,conntype=self.initpara(para)  
  116.         paramap=self.argv2map(userid,host,conntype)  
  117.         url,password=self.createSshUrl(paramap)  
  118.         self.connection(url,password)  
  119. class ProxySsh(SimpleSsh):  
  120.     def initpara(self,para):  
  121.         self.defaultType="ssh"  
  122.         paramaparray={}  
  123.         argvarray=string.split(para,"-")  
  124.         for x in argvarray:  
  125.             if string.strip(x)=="": continue  
  126.             x=string.split(x," ")  
  127.             #print x[1],",",x[2],",",self.defaultType  
  128.             paramaparray[x[0]]=self.argv2map(x[1],x[2],self.defaultType)  
  129.   
  130.         return paramaparray  
  131.     def createSshUrl(self,paramaparray):  
  132.         parakey=paramaparray.keys()  
  133.         parakey.sort()  
  134.         url="luit -encoding %character2% ssh -t %s1% \"bash -c 'ssh %s2%'\""  
  135.         print "#"*40  
  136.         for x in parakey:  
  137.             paramap=paramaparray[x]  
  138.             tmp=string.join((paramap["user"],"@",paramap["host"]),"")  
  139.             tmp1="%s"+x+"%"  
  140.             tmp2="%character"+x+"%"  
  141.             print "#",string.center(string.join((x,":",tmp,paramap["characters"]),""),36),"#"  
  142.             url=string.replace(url,tmp1,tmp)  
  143.             url=string.replace(url,tmp2,paramap["characters"])  
  144.         print "#",string.center("created by lijunjieone@gmail.com",36),"#"    
  145.         print "#"*40  
  146.         try:  
  147.             p=pexpect.spawn(url)  
  148.             try:  
  149.                 p.setwinsize(self.lines,self.columns)  
  150.                 print "resize windows(%s,%s)"%(columns,lines)  
  151.             except:  
  152.                 pass  
  153.               
  154.             for x in parakey:  
  155.                 paramap=paramaparray[x]  
  156.                 password=paramap["password"]  
  157.                 p.expect("password")  
  158.                 p.sendline(password)  
  159.                   
  160.             p.interact()  
  161.         except:  
  162.             print "connection close()"  
  163.   
  164.   
  165.     def handle(self,para):  
  166.         paramaparray=self.initpara(para)  
  167.         url=self.createSshUrl(paramaparray)  
  168.           
  169.   
  170. if __name__=="__main__":  
  171.     """help: 
  172.     ./myssh.py ljj51 127.0.0.1 
  173.     ./myssh.py ljj51 127.0.0.1 sftp 
  174.     ./myssh.py -1 ljj51 127.0.0.1 -2 ljj52 127.0.0.2 
  175.     """  
  176.     help="""help: 
  177.          ./myssh.py ljj51 127.0.0.1 
  178.          ./myssh.py ljj51 127.0.0.1 sftp 
  179.          ./myssh.py -1 ljj51 127.0.0.1 -2 ljj52 127.0.0.2 
  180.          """  
  181.   
  182.     argvpara=string.join(sys.argv[1:]," ")  
  183.     if "-" in argvpara:  
  184.         b=ProxySsh()  
  185.         b.handle(argvpara)  
  186.     elif "help" in argvpara:  
  187.         print help  
  188.     管理员在2009年8月13日编辑了该文章文章。
-->
阅读(875) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~