python实现ssh远程连接linux主机,并执行指令,上篇已提到;

在一个堡垒机自动化测试的项目中,一开始我简单的想,用paramiko远程连接linux主机的方式,去连接堡垒机,然后再发送指令,应该就可以实现了吧。


实际上,思路是没错的,堡垒机本质上也是一个linux主机,ssh连接堡垒机也是OK的,但是连接上后,使用exec_command方法发送指令选择资源主机时,却总是返回No
support the request method,“不支持请求方法”?


开始猜想,难道ssh登录堡垒机后的界面,并不是bash吗?所以不支持exec_command?咨询了开发人员,确认了,确实堡垒机的界面不是普通shell交互界面,大概有加一层类似通道的东西。

说的很模糊,我差点要放弃了,转念一想,paramiko好像是可以创建chanel连接的,试试chanel吧

对于paramiko的模块只是依葫芦画瓢,并没有深刻的理解和研究,就是拿来用能实现我的需求就ok了,所以chanel的概念我也不是很明白,只是一试;

居然就OK了,好激动!!

中间加了sleep等待堡垒机连接资源主机,并且堡垒机选择资源的指令加了回车'\n'
# SSH远程连接堡垒机操作系统,并选择目标主机资源id,进入目标主机执行批量命令 def
sshHost_sendCmd(ip,username,password,hosttype,port,cmds): ''' :param ip: 堡垒机ip
:param username: 堡垒机用户 :param password: 用户的密码 :param hosttype:
主机类型,普通主机-normal,数据库主机-db :param port: 堡垒机端口 :param cmds: 存放n个命令的列表 :return:
''' paramiko.util.log_to_file("paramiko.log") try: # excmd = ';'.join(cmds) s =
paramiko.SSHClient() s.set_missing_host_key_policy(paramiko.AutoAddPolicy())
s.connect(hostname=ip, port=port, username=username, password=password)
#激活连接的终端 channel = s.invoke_shell() #读、写操作超时时间,10秒 channel.settimeout(10)
choose ='' if hosttype == 'normal': choose = '0'+'\n' print u'选择普通linux资源主机:0',
elif hosttype == 'db': choose = '1'+'\n' print u'选择mysql资源主机:1', else:print
u'hosttype输入错误!(normal/db)' #输入选择的资源主机 channel.send(choose) #等待堡垒机连接资源主机成功
time.sleep(5) #发送cmds中的指令到资源主机 for command in cmds: print u'执行命令:%s'%command
channel.send(command+'\n') time.sleep(2) try: command_res =
channel.recv(65533).decode('utf-8').strip() print command_res except Exception
as e: print (u'在目标机(IP: %s)上进行读取操作超时') break channel.close() except Exception
as e: print(e)
 

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信