经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Python3 » 查看文章
python3模拟实现xshell远程执行liunx命令的方法
来源:jb51  时间:2019/7/12 10:56:38  对本文有异议

依赖包:pip install paramiko

源码demo:

  1. from time import *
  2. import paramiko
  3. # 定义一个类,表示一台远端linux主机
  4. class Linux(object):
  5. # 通过IP, 用户名,密码,超时时间初始化一个远程Linux主机
  6. def __init__(self, ip, username, password, timeout=30):
  7. self.ip = ip
  8. self.username = username
  9. self.password = password
  10. self.timeout = timeout
  11. # transport和chanel
  12. self.t = ''
  13. self.chan = ''
  14. # 链接失败的重试次数
  15. self.try_times = 3
  16. # 调用该方法连接远程主机
  17. def connect(self):
  18. while True:
  19. # 连接过程中可能会抛出异常,比如网络不通、链接超时
  20. try:
  21. self.t = paramiko.Transport(sock=(self.ip, 22))
  22. self.t.connect(username=self.username, password=self.password)
  23. self.chan = self.t.open_session()
  24. self.chan.settimeout(self.timeout)
  25. self.chan.get_pty()
  26. self.chan.invoke_shell()
  27. # 如果没有抛出异常说明连接成功,直接返回
  28. print('连接%s成功' % self.ip)
  29. # 接收到的网络数据解码为str
  30. print(self.chan.recv(65535).decode('utf-8'))
  31. return
  32. # 这里不对可能的异常如socket.error, socket.timeout细化,直接一网打尽
  33. except Exception as e1:
  34. if self.try_times != 0:
  35. print('连接%s失败,进行重试' % self.ip)
  36. self.try_times -= 1
  37. else:
  38. print('重试3次失败,结束程序')
  39. exit(1)
  40. # 断开连接
  41. def close(self):
  42. self.chan.close()
  43. self.t.close()
  44. # 发送要执行的命令
  45. def send(self, cmd):
  46. cmd += '\r'
  47. result = ''
  48. # 发送要执行的命令
  49. self.chan.send(cmd)
  50. # 回显很长的命令可能执行较久,通过循环分批次取回回显,执行成功返回true,失败返回false
  51. while True:
  52. sleep(0.5)
  53. ret = self.chan.recv(65535)
  54. ret = ret.decode('utf-8')
  55. result += ret
  56. return result
  57. '''
  58. 发送文件
  59. @:param upload_files上传文件路径 例如:/tmp/test.py
  60. @:param upload_path 上传到目标路径 例如:/tmp/test_new.py
  61. '''
  62. def upload_file(self,upload_files,upload_path):
  63. try:
  64. tran=paramiko.Transport(sock=(self.ip, self.port))
  65. tran.connect(username=self.username, password=self.password)
  66. sftp = paramiko.SFTPClient.from_transport(tran)
  67. result=sftp.put(upload_files, upload_path)
  68. return True if result else False
  69. except Exception as ex:
  70. print(ex)
  71. tran.close()
  72. finally:
  73. tran.close()
  74. # 连接正常的情况
  75. if __name__ == '__main__':
  76. host = Linux('192.168.16.57', 'root', '+B*A15*EFpKG') # 传入Ip,用户名,密码
  77. host.connect()
  78. # result = host.send('ls') # 发送一个查看ip的命令
  79. def input_cmd(str):
  80. return input(str)
  81. tishi_msg="输入命令:"
  82. while True:
  83. msg=input(tishi_msg)
  84. if msg=="exit":
  85. host.close()
  86. break
  87. else:
  88. res=host.send(msg)
  89. data=res.replace(res.split("\n")[-1],"")
  90. tishi_msg=res.split("\n")[-1]
  91. print(res.split("\n")[-1] + data.strip("\n"))

运行代码测试效果图:

以上这篇python3模拟实现xshell远程执行liunx命令的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号