当前位置: 首页 > news >正文

Python通过ssh连接服务器并执行命令

[本文出自天外归云的博客园]

脚本示例如下:

# coding:utf-8
import time,paramiko,re,StringIO

def exec_shell(command):
    '''
        command:传入的要执行的shell命令
    '''
    f = StringIO.StringIO()
    header_match = '(\[.+?@.+?\s.+?\]\$)'
    ssh.send(command+'\n')
    while True:
        out = ssh.recv(1024)
        print out,
        f.write(out)
        header_list = re.findall(header_match, out)
        if header_list and out.strip().endswith(header_list[-1]):
            break
    return f

def check_ip(content):
    '''
        从content中取出所有符合xx.120.xx.xx格式的ip地址(xx代表任意多数字)并返回
    '''
    ips = re.findall('\d+\.120\.\d+\.\d+',content)
    return ips

if __name__ == '__main__':
    '''
        host:对应要连接的服务器ip
        port:对应连接服务器的端口
        username:对应访问服务器的用户名
    '''
    host = '10.120.143.70'
    port = 8822
    username = 'bjlantianyou'
    '''
        key_file为secureCRT对应的OpenSSH格式的私钥文件
        可以在secureCRT的'Tools->Convert Private Key to OpenSSH Format...'选择相应的私钥文件转化为OpenSSH格式
        例如:在Windows下保存到'E:\keys\'路径下,保存文件名为'id_rsa'
    '''
    key_file = 'E:\\keys\\id_rsa'
    key = paramiko.RSAKey.from_private_key_file(key_file)
    s = paramiko.SSHClient()
    s.load_system_host_keys()
    s.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    s.connect(host, port, username, pkey=key)
    ssh = s.invoke_shell()
    '''
        下面对应在secureCRT上执行命令的过程
    '''
    exec_shell('cd /home/project/api.winyyg.com')
    out = exec_shell('ls')
    ips = check_ip(out.getvalue())
    exec_shell('cat '+ips[0]+'/log/duobao.log')

注意:缓冲区为空的情况下,ssh.recv(1024)会hang住。

可以进一步利用这个方法做一个自动化过滤log的工具或平台。

 

相关文章:

  • Oracle附录——Oracle事务
  • 微信小程序 view 布局
  • 首篇
  • 查看数据库字符集
  • vagrant 添加本地 box 安装 laravel homestead
  • eclipse(luna)创建web工程
  • Vim 折腾记
  • $.ajax()
  • 用Zookeeper实现分布式锁和选主
  • 最近5年183个Java面试问题列表及答案[最全]
  • cloudbase-init 自动扩盘的副作用 - 每天5分钟玩转 OpenStack(154)
  • Android笔记--TCP Scoket(字符串收发)
  • HTML5 自定义属性 dataset
  • 一步一步学Python(2) 连接多台主机执行脚本
  • MySQL添加用户、删除用户与授权
  • 【翻译】babel对TC39装饰器草案的实现
  • gitlab-ci配置详解(一)
  • Java|序列化异常StreamCorruptedException的解决方法
  • PaddlePaddle-GitHub的正确打开姿势
  • Python socket服务器端、客户端传送信息
  • Spring-boot 启动时碰到的错误
  • ucore操作系统实验笔记 - 重新理解中断
  • Windows Containers 大冒险: 容器网络
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 构造函数(constructor)与原型链(prototype)关系
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 来,膜拜下android roadmap,强大的执行力
  • 排序算法之--选择排序
  • 批量截取pdf文件
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • Java总结 - String - 这篇请使劲喷我
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • ​卜东波研究员:高观点下的少儿计算思维
  • #DBA杂记1
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • (02)vite环境变量配置
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (3)llvm ir转换过程
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (42)STM32——LCD显示屏实验笔记
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .NET程序员迈向卓越的必由之路
  • .net项目IIS、VS 附加进程调试
  • .so文件(linux系统)
  • @SuppressWarnings注解
  • [BetterExplained]书写是为了更好的思考(转载)
  • [C#]winform部署yolov5-onnx模型