linux下使用脚本自动登录远程服务器

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

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



#userid:user:password:characters
ljj51:ljj:123456:gbk


登录脚本



#!/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
else:
b=SimpleSsh()
b.handle(sys.argv)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值