免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2502 | 回复: 0
打印 上一主题 下一主题

linux下使用脚本自动登录远程服务器 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-06-12 19:03 |只看该作者 |倒序浏览

               
               
               
                ubuntu下的ssh客户端一直没找到象SecureCRT那样好用的工具。用ssh登录,每次都要输入密码,感觉很麻烦,而且因为字符集不相同,一般还有乱码问题,所以参照网上的一些实现自己也通过python来实现了一下。
#1.通过参数自动登录ssh远程服务器
#2.通过配置字符集解决中文乱码问题
#3.解决改变远程窗口默认较小bug,远程窗口同本地窗口大小动态改变未处理
#4.实现2级代理
#5.可以使用sftp登录来传文件(sftp,目前不能实现代理来作)
配置文件host.properties
第一列可以为id,第二列为用户名,第一列为密码,第四列为远程服务器字符集
Java代码 #userid:user:password:characters  ljj51:ljj:123456:gbk  
登录脚本
Python代码 #!/usr/bin/env python  #coding:UTF-8  #1.通过参数自动登录ssh远程服务器  #2.通过配置字符集解决中文乱码问题  #3.解决改变远程窗口默认较小bug,远程窗口同本地窗口大小动态改变未处理  #4.实现2级代理    import os,sys,pexpect,string  import struct,fcntl,termios,signal    try:      import pexpect  except:      print "你没有pexpect包,试试sudo apt-get install python-pexpect"      sys.exit(0)    def sigwinch_passthrough(sig,data):      """窗口改动后,自动返回当前窗口值,以便跟远程窗口同步,目前有问题"""      s=struct.pack("HHHH",0,0,0,0)      a=struct.pack('hhhh',fcntl.ioctl(sys.stdout.fileno(),termios.TIOCGWINSZ,s))        #global columns,lines      """ self.lines=a[0]     self.columns=a[1]     print "resize windows size(%s,%s)"%(self.lines,self.columns)     """      print a[0],a[1]    class SimpleSsh:      def __init__(self):          self.columns=125          self.lines=37          self.base="~/ssh/"          self.filename="host.properties"        def createSshUrl(self,paramap):          user=paramap["user"]          password=paramap["password"]          host=paramap["host"]          characters=paramap["characters"]          conntype=paramap["conntype"]          url="luit -encoding "+characters+" "+conntype+" "+user+"@"+host            print "#"*40          print "#",string.center(string.join((user,"@",host," by ",characters),""),36),"#"          print "#",string.center("created by lijunjieone@gmail.com",36),"#"          print "#"*40                    return url,password        def connection(self,url,password):          """ """          columns=self.columns          lines=self.lines          try:              p=pexpect.spawn(url)              try:                  #signal.signal(signal.SIGWINCH,sigwinch_passthrough)                  p.setwinsize(lines,columns)                  print "resize windows(%s,%s)"%(columns,lines)              except:                  pass              p.expect("password:")              p.sendline(password)              p.interact()          except:              print "connection close()"            def argv2map(self,userid,host,conntype):          paramap={}          base=self.base          filename=self.filename          tmp=""          try:              file=open(filename,"r")          except:              file=open(string.join(base,filename))          content=file.readlines()            for x in content:              if x.startswith(userid):                  tmp=string.strip(x)            if tmp=="":              print "not found %s"%userid              sys.exit(0)            tmparray=string.split(tmp,":")          paramap["user"]=tmparray[1]          paramap["password"]=tmparray[2]          paramap["userid"]=userid          paramap["host"]=host          paramap["characters"]=tmparray[3]          paramap["conntype"]=conntype            return paramap        def initpara(self,para):          try:              userid=para[1]              host=para[2]              conntype=""          except:              userid=raw_input("enter your userid:")              host=raw_input("enter your host:")          try:              conntype=para[3]          except:              conntype="ssh"            return userid,host,conntype              def handle(self,para):          userid,host,conntype=self.initpara(para)          paramap=self.argv2map(userid,host,conntype)          url,password=self.createSshUrl(paramap)          self.connection(url,password)  class ProxySsh(SimpleSsh):      def initpara(self,para):          self.defaultType="ssh"          paramaparray={}          argvarray=string.split(para,"-")          for x in argvarray:              if string.strip(x)=="": continue              x=string.split(x," ")              #print x[1],",",x[2],",",self.defaultType              paramaparray[x[0]]=self.argv2map(x[1],x[2],self.defaultType)            return paramaparray      def createSshUrl(self,paramaparray):          parakey=paramaparray.keys()          parakey.sort()          url="luit -encoding %character2% ssh -t %s1% \"bash -c 'ssh %s2%'\""          print "#"*40          for x in parakey:              paramap=paramaparray[x]              tmp=string.join((paramap["user"],"@",paramap["host"]),"")              tmp1="%s"+x+"%"              tmp2="%character"+x+"%"              print "#",string.center(string.join((x,":",tmp,paramap["characters"]),""),36),"#"              url=string.replace(url,tmp1,tmp)              url=string.replace(url,tmp2,paramap["characters"])          print "#",string.center("created by lijunjieone@gmail.com",36),"#"            print "#"*40          try:              p=pexpect.spawn(url)              try:                  p.setwinsize(self.lines,self.columns)                  print "resize windows(%s,%s)"%(columns,lines)              except:                  pass                            for x in parakey:                  paramap=paramaparray[x]                  password=paramap["password"]                  p.expect("password")                  p.sendline(password)                                p.interact()          except:              print "connection close()"          def handle(self,para):          paramaparray=self.initpara(para)          url=self.createSshUrl(paramaparray)              if __name__=="__main__":      """help:     ./myssh.py ljj51 127.0.0.1     ./myssh.py ljj51 127.0.0.1 sftp     ./myssh.py -1 ljj51 127.0.0.1 -2 ljj52 127.0.0.2     """      help="""help:          ./myssh.py ljj51 127.0.0.1          ./myssh.py ljj51 127.0.0.1 sftp          ./myssh.py -1 ljj51 127.0.0.1 -2 ljj52 127.0.0.2          """        argvpara=string.join(sys.argv[1:]," ")      if "-" in argvpara:          b=ProxySsh()          b.handle(argvpara)      elif "help" in argvpara:          print help      <span class="keywo

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/14754/showart_1963214.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP