python 远程执行命令的详细代码


Posted in Python onFebruary 15, 2022

1.简单版

# coding: utf-8

import paramiko
import re
from time import sleep
def ssh():
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())    #指定当对方主机没有本机公钥的情况时应该怎么办,AutoAddPolicy表示自动在对方主机保存下本机的秘钥
    ssh.connect('172.16.1.5',22,'linyouyi','123456')    #SSH端口默认22,可改
    stdin,stdout,stderr = ssh.exec_command("df -hl")    #这三个得到的都是类文件对象
    outmsg,errmsg = stdout.read(),stderr.read()    #读一次之后,stdout和stderr里就没有内容了,所以一定要用变量把它们带的信息给保存下来,否则read一次之后就没有了
    #outmsg = str(outmsg)
    #print(outmsg.replace("\\n","\\r\\n"))
    print(outmsg.decode())
    print(errmsg)
    if errmsg == "":
        print(outmsg)
    ssh.close()
if __name__ == '__main__':
    ssh()

2.封装版

# coding: utf-8

import paramiko
import re
from time import sleep
# 定义一个类,表示一台远端linux主机
class Linux(object):
    # 通过IP, 用户名,密码,超时时间初始化一个远程Linux主机
    def __init__(self, ip, username, password, timeout=30):
        self.ip = ip
        self.username = username
        self.password = password
        self.timeout = timeout
        # transport和chanel
        self.t = ''
        self.chan = ''
        # 链接失败的重试次数
        self.try_times = 3
    # 调用该方法连接远程主机
    def connect(self):
        while True:
            # 连接过程中可能会抛出异常,比如网络不通、链接超时
            try:
                self.t = paramiko.Transport(sock=(self.ip, 22))
                self.t.connect(username=self.username, password=self.password)
                self.chan = self.t.open_session()
                self.chan.settimeout(self.timeout)
                self.chan.get_pty()
                self.chan.invoke_shell()
                # 如果没有抛出异常说明连接成功,直接返回
                print(u'连接%s成功' % self.ip)
                # 接收到的网络数据解码为str
                print(self.chan.recv(65535).decode('utf-8'))
                return
            # 这里不对可能的异常如socket.error, socket.timeout细化,直接一网打尽
            except Exception as e1:
                if self.try_times != 0:
                    print(u'连接%s失败,进行重试' %self.ip)
                    self.try_times -= 1
                else:
                    print(u'重试3次失败,结束程序')
                    exit(1)
    # 断开连接
    def close(self):
        self.chan.close()
        self.t.close()
    # 发送要执行的命令
    def send(self, cmd):
        cmd += '\r'
        # 通过命令执行提示符来判断命令是否执行完成
        p = re.compile(r']$')
        result = ''
        # 发送要执行的命令
        self.chan.send(cmd)
        # 回显很长的命令可能执行较久,通过循环分批次取回回显
            sleep(2)
            ret = self.chan.recv(65535)
            ret = ret.decode('utf-8')
            result += ret
            if p.search(ret):
                print(result)
                return(result)
                
if __name__ == '__main__':
    host = Linux('172.16.1.5', 'linyouyi', '123456')
    host.connect()
    host.send('ll')
    host.close()

到此这篇关于python 远程执行命令的文章就介绍到这了,更多相关python 远程执行命令内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python里对list中的整数求平均并排序
Sep 12 Python
Python中利用函数装饰器实现备忘功能
Mar 30 Python
Python编程中使用Pillow来处理图像的基础教程
Nov 20 Python
Python中文分词工具之结巴分词用法实例总结【经典案例】
Apr 15 Python
python3实现公众号每日定时发送日报和图片
Feb 24 Python
Python cookbook(数据结构与算法)将多个映射合并为单个映射的方法
Apr 19 Python
python中的插值 scipy-interp的实现代码
Jul 23 Python
python 画二维、三维点之间的线段实现方法
Jul 07 Python
Python及Pycharm安装方法图文教程
Aug 05 Python
python time()的实例用法
Nov 03 Python
matplotlib部件之套索Lasso的使用
Feb 24 Python
Python中time与datetime模块使用方法详解
Mar 31 Python
python 详解turtle画爱心代码
python分分钟绘制精美地图海报
基于PyQT5制作一个桌面摸鱼工具
Feb 15 #Python
python接口测试返回数据为字典取值方式
Feb 12 #Python
Python socket如何解析HTTP请求内容
Feb 12 #Python
python全面解析接口返回数据
Feb 12 #Python
http通过StreamingHttpResponse完成连续的数据传输长链接方式
Feb 12 #Python
You might like
模拟OICQ的实现思路和核心程序(三)
2006/10/09 PHP
PHP 实现类似js中alert() 提示框
2015/03/18 PHP
php解析xml方法实例详解
2015/05/12 PHP
深入理解javascript的执行顺序
2014/04/04 Javascript
iframe里的页面禁止右键事件的方法
2014/06/10 Javascript
基于NodeJS的前后端分离的思考与实践(二)模版探索
2014/09/26 NodeJs
JS替换字符串中空格方法
2015/04/17 Javascript
js实现简洁大方的二级下拉菜单效果代码
2015/09/01 Javascript
详谈javascript异步编程
2016/02/21 Javascript
JS复制对应id的内容到粘贴板(Ctrl+C效果)
2017/01/23 Javascript
jQuery滚动监听实现商城楼梯式导航效果
2017/03/06 Javascript
AngularJS自定义指令之复制指令实现方法
2017/05/18 Javascript
vue+php实现的微博留言功能示例
2019/03/16 Javascript
Vue源码解析之数据响应系统的使用
2019/04/24 Javascript
vue 进阶之实现父子组件间的传值
2019/04/26 Javascript
基于Layui自定义模块的使用方法详解
2019/09/14 Javascript
Nuxt页面级缓存的实现
2020/03/09 Javascript
python读取word文档的方法
2015/05/09 Python
Python中模块与包有相同名字的处理方法
2017/05/05 Python
浅谈pytorch和Numpy的区别以及相互转换方法
2018/07/26 Python
对pandas通过索引提取dataframe的行方法详解
2019/02/01 Python
我用Python抓取了7000 多本电子书案例详解
2019/03/25 Python
浅谈keras保存模型中的save()和save_weights()区别
2020/05/21 Python
html5 的a标签 Href 拨电话的写法
2013/11/04 HTML / CSS
Html5 语法与规则简要概述
2014/07/29 HTML / CSS
澳大利亚最超值的自行车之家:Reid Cycles
2019/03/24 全球购物
如何拷贝一整个Java对象,包括它的状态
2013/12/27 面试题
公证委托书模板
2014/04/03 职场文书
区长工作作风个人整改措施
2014/10/01 职场文书
试用期工作表现自我评价
2015/03/06 职场文书
2015年财务工作总结范文
2015/03/31 职场文书
2016年大学生暑期社会实践活动总结
2016/04/06 职场文书
vue使用refs获取嵌套组件中的值过程
2022/03/31 Vue.js
MySQL中的全表扫描和索引树扫描
2022/05/15 MySQL
git stash(储藏)的用法总结
2022/06/25 Servers
详解SQL报错盲注
2022/07/23 SQL Server