第三篇:彻底解决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() 返回的中文问题的主要内容,如果未能解决你的问题,请参考以下文章