第三篇:彻底解决ssh.invoke_shell() 返回的中文问题

Posted FelixApff

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第三篇:彻底解决ssh.invoke_shell() 返回的中文问题相关的知识,希望对你有一定的参考价值。

 接上一篇,前两篇解决中文的问题主要是在字符集上做的手脚,即将中文转成英文,但是有一种情况我们都来不及做转换,即登录时服务器直接返回了中文内容:

此时程序报了如下错误,其实还是字符集问题:

为此:我们可以在接收数据的时候直接对其进行异常捕捉,如果异常则换一种解码方式:

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)
            try: #进行异常捕捉,如果解码有问题,则换一种解码方式
                buff += resp.decode(\'utf8\')
            except Exception as e:
                buff += resp.decode(\'gb18030\')
            print(resp)
            time.sleep(0.1)
        print(\'获取登录后的提示符:%s\' %buff)


        ssh.send(\' export LANG=en_US.UTF-8 \\n\') #解决错误的关键,编码问题
        ssh.send(\'export LANGUAGE=en \\n\')

        ssh.send(\'su - \\n\')

        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(\'\\n\')

        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(\'\\n\')
        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\')

 

上一篇:ssh.invoke_shell() 切换root出现的新问题

 注:转载请注明出处

以上是关于第三篇:彻底解决ssh.invoke_shell() 返回的中文问题的主要内容,如果未能解决你的问题,请参考以下文章

Docker第三篇彻底搞懂Dockerfile文件

第三篇:开发中的问题及解决方式

从0开始设计Flutter独立APP | 第三篇: 一劳永逸解决全局BuildContext问题

Mybatis框架-第三篇

小学期--第三篇

深入理解表单脚本系列第三篇——选择文本