目录回归:
Telnet传输过程采用TCP进行明文传输,存在很大的安全隐患,如无特殊需求,一般也会建议禁用telnet,而采用ssh协议。
今天小Q学习记录主要分成两个目标,分别是:
1、根据上次学习的telnet远程登录设备,修改下脚本,使其功能实现:自动开启ssh功能
2、使用ssh来登录设备,并执行简单命令,获取设备基础信息
下面开始咯:
关于设备的开启ssh,小Q参考了zWX67834大牛的文章。
命令记录如下:
[R1]stelnet server enable
[R1-aaa]local-user ssh001 privilege level 3 password cipher ssh001
Info: Add a new user.
[R1-aaa]local-user ssh001 service-type ssh
[R1-aaa]q
[R1]user-interface vty 0 4
[R1-ui-vty0-4]authentication-mode aaa
[R1-ui-vty0-4]protocol inbound ssh
小脚本的代码修改自上个帖子,如果执行用户模式命令就使用UsermodeRunCommand函数,如果执行sys模式命令就使用SysmodeRunCommand函数
代码如下:
#!/usr/bin/python
#coding=utf-8
# 通过telnet 开启ssh协议 并关闭telnet协议
import telnetlib
import os
import time
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
### 配置登录信息
_Username = 'huawei'
_Password = 'huawei123'
_Host = '192.168.1.110'
# 命令结束提示符
# 正常模式如 来提示用户输入命令,所以取>为作为标志符
_UsermodTag = '>'
# system-view模式如[R1] 来提示用户输入命令,所以取]为作为标志符
_SysrmodTag = ']'
# 封装到一个登录函数里面
def ConnHwTelnet(_Host,_Username,_Password,_UsermodTag='>',_SysrmodTag=']'):
# 实例化telnet对象,建立一个主机连接
telnetsession = telnetlib.Telnet(_Host)
# 开启调试,按需开启,方便判断
#telnetsession.set_debuglevel(2)
# read_until()来判断缓冲区中的数据是否有想要的内容,如果没有就等待
# 当然也可以使用expect方法,与read_until差不多,但是它可以支持正则表达式,功能要强大得多
# 区配字符,当出现'Username'时,输入用户名
login_prompt = 'Username'
response = telnetsession.read_until(login_prompt)
if login_prompt in response:
#print response
print '[*] Username: ',_Username
telnetsession.write(_Username + "\n")
time.sleep(2)
# 区配字符,当出现'Password'时,输入密码
password_prompt = 'Password'
response = telnetsession.read_until(password_prompt)
if password_prompt in response:
#print response
print '[*] Password: ',_Password
time.sleep(2)
telnetsession.write(_Password+ "\n")
# 如果登录成功,则出现类似,使用_UsermodTag来进行捕获
response = telnetsession.read_until(_UsermodTag)
if _UsermodTag in response:
print response
time.sleep(2)
# 成功后,返回一个成功链接实例
return telnetsession
# 执行用户模式命令
def UsermodeRunCommand(telnetsession,command,_UsermodTag='>'):
command = "%s\n" % command
telnetsession.write(command)
response = telnetsession.read_until(_UsermodTag)
if _UsermodTag in response:
print response
# 执行system模式命令
def SysmodeRunCommand(telnetsession,command,_SysrmodTag=']'):
command = "%s\n" % command
telnetsession.write(command)
response = telnetsession.read_until(_SysrmodTag)
if _SysrmodTag in response:
print response
if __name__ == '__main__':
telnetsession = ConnHwTelnet(_Host,_Username,_Password,_UsermodTag,_SysrmodTag)
# 如果执行用户模式命令就使用UsermodeRunCommand函数,如果执行sys模式命令就使用SysmodeRunCommand函数
# 开启 ssh
# 1 切换到system-view
SysmodeRunCommand(telnetsession,"system-view")
# 2 开启SSH服务并创建账号,帐号可以自行设置
SysmodeRunCommand(telnetsession,"stelnet server enable")
SysmodeRunCommand(telnetsession,"aaa")
SysmodeRunCommand(telnetsession,"local-user hw001 privilege level 3 password cipher hw001")
SysmodeRunCommand(telnetsession,"local-user hw001 service-type ssh")
SysmodeRunCommand(telnetsession,"q")
# 3 配置VTY上允许SSH协议
SysmodeRunCommand(telnetsession,"user-interface vty 0 4")
SysmodeRunCommand(telnetsession,"authentication-mode aaa")
SysmodeRunCommand(telnetsession,"protocol inbound ssh")
# 测试完毕后,关闭连接
telnetsession.close()
print '[*] Session Close.'
运行后,将会开启ssh服务,并添加一个账号,结果如下,
此时设备已经开启了ssh,使用putty进行检测一下:
好的,现在我们的设备已经支持了ssh登录,接下来我们将编写脚本来使用ssh登录设备。
此次小Q将使用Exscript这个模块来编写脚本,安装此脚本和简单的使用的详细教程请看此链接
登录成功后将进行基本的检查操作 'display
version','display startup','display clock',代码如下,
#!/usr/bin/python
#coding=utf-8
# 通过ssh协议 登录设备,并执行命令
from Exscript.util.interact import read_login
from Exscript.protocols import SSH2
from Exscript import Account
import os
import time
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
### 配置登录信息
_Username = 'hw001'
_Password = 'hw001'
_Host = '192.168.1.110'
def LoginSSH(_Host,_Username,_Password) :
print "[+] Loging Host : %s " % _Host
account = Account(_Username,_Password)
ssh = SSH2()
try :
print "[+] Trying to Login in with username: %s password: %s " % (_Username,_Password)
ssh.connect(_Host)
ssh.login(account)
except Exception,e:
print "[-] Failed! ...",e
return 'LoginError',ssh
print "[+] Success ... username: %s and passoword %s is VALID! " % (_Username, _Password)
return 'LoginSuccess',ssh
def StartExecuteCommand(sshConnection,command):
sshConnection.execute(command)
print sshConnection.response
if __name__ == '__main__':
LoginResult,sshConnection = LoginSSH(_Host,_Username,_Password)
# 登录成功后即可执行命令,基本检查信息
Commandlist = ['display version','display startup','display clock']
if LoginResult == 'LoginSuccess':
for command in Commandlist:
StartExecuteCommand(sshConnection,command)
# 关闭连接
sshConnection.close()
print '[*] Session Close.'
看,自动管理设备设备就是这么简单,只要简单改脚本,就可以支持批量管理设备了,同时也可以把输出信息写到一个文件中,这样就可以随时查看了。
接下来小Q将学习编写一个自动备份配置的小东东。