• 第二篇:ssh.invoke_shell() 切换root出现的新问题


    接上一篇:按照上一篇的方式,在没有对ssh.invoke_shell()执行后的登录提示符进行判断的话,那边有部分机器就回因为返回为空导致程序卡死。

    正常机器  ssh.recv(9999)  命令返回内容:

    b'Last login: Sat Aug 18 22:06:17 2018 from 172.37.100.111 [cattsoft@ZB_KT_MAS2 ~]$ '
    b'export LANG=en_US.UTF-8 [cattsoft@ZB_KT_MAS2 ~]$ export LANGUAGE=en [cattsoft@ZB_KT_MAS2 ~]$ su - Password: '

          程序的模拟登陆过程如下(以下图片内容为ssh.recv(9999) 命令接收返回值解码后的结果):

         

    异常机器ssh.recv(9999)  命令返回内容:

    b'export LANG=en_US.UTF-8 '
    b'export LANGUAGE=en su - Last login: Sat Aug 18 21:42:09 from 172.16.112.2 [cattsoft@trancache01 ~]$ '

          程序的模拟登陆过程如下(以下图片内容为ssh.recv(9999) 命令接收返回值解码后的结果)

         

    如上,按照原来的循环方式,循环无法判断Password:位置,所以异常机器此时就回出现卡死现象,解决此问题的做法:在执行命令前,先判断一次登陆符:“$”,然后在执行命令。

    def verification_ssh(host,username,password,port,root_pwd,cmd):
        s=paramiko.SSHClient()
        s.load_system_host_keys()
        s.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        s.connect(hostname = host,port=int(port),username=username, password=password)
    
        if username != 'root':
            ssh = s.invoke_shell()
            time.sleep(0.1)
    
    #先判断提示符,然后下一步在开始发送命令,这样大部分机器就都不会出现问题 buff
    = '' while not buff.endswith('$ '): resp = ssh.recv(9999) # print(resp) buff += resp.decode('utf8') time.sleep(0.1) print('获取登录后的提示符:%s' %buff) ssh.send(' export LANG=en_US.UTF-8 ') #解决错误的关键,编码问题 ssh.send('export LANGUAGE=en ') ssh.send('su - ') buff = "" while not buff.endswith('Password: '): #true resp = ssh.recv(9999) print(resp) buff +=resp.decode('utf8') print('hhhhh') print(buff) ssh.send(root_pwd) ssh.send(' ') buff = "" # n = 0 while not buff.endswith('# '): # n += 1 resp = ssh.recv(9999) print(resp) buff +=resp.decode('utf8') # print(n) # if n >=3: # break # print(buff) ssh.send('sh /tmp/check/101.sh') #放入要执行的命令 ssh.send(' ') buff = '' # m = 0 while not buff.endswith('# '): resp = ssh.recv(9999).decode() buff +=resp # m += 1 # print(m) result = buff # print(type(result)) # print(result) s.close() if __name__ == "__main__": verification_ssh('测试IP地址', '普通账号', '普通账号的密码', '52222', 'root密码', 'id')

     上一篇:https://www.cnblogs.com/apff/p/9484939.html (python如何实现普通用户登录服务器后切换到root用户再执行命令遇到的错误解决 )

  • 相关阅读:
    R语言︱H2o深度学习的一些R语言实践——H2o包
    笔记︱集成学习Ensemble Learning与树模型、Bagging 和 Boosting
    笔记+R︱风控模型中变量粗筛(随机森林party包)+细筛(woe包)
    笔记︱支持向量机SVM在金融风险欺诈中应用简述
    笔记+R︱信用风险建模中神经网络激活函数与感知器简述
    笔记+R︱Logistics建模简述(logit值、sigmoid函数)
    笔记︱金融风险之欺诈分类以及银行防控体系简述
    笔记︱风控分类模型种类(决策、排序)比较与模型评估体系(ROC/gini/KS/lift)
    我如何向 HR MM 介绍 Microservice
    sql server查看用户权限
  • 原文地址:https://www.cnblogs.com/apff/p/9501124.html
Copyright © 2020-2023  润新知