Chinaunix

标题: linux下使用脚本自动登录远程服务器 [打印本页]

作者: uranusllj    时间: 2009-06-12 19:03
标题: linux下使用脚本自动登录远程服务器

               
               
               
                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




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2