zoukankan      html  css  js  c++  java
  • python用parammiko模块实现linux的远程操作

    parammiko  可以实现远程的带密码登录,解决ssh远程登陆需要交互的问题 (当然很多其他的,如tcl也可以)。但这个用python做比较简单

       

    1、parammiko 的安装

    1.1、依赖模块

    PyCrypto - The Python Cryptography Toolkit

    1.2下载地址$ wget http://www.lag.net/paramiko/download/paramiko-1.7.6.tar.gz

    $ wget http://ftp.dlitz.net/pub/dlitz/crypto/pycrypto/pycrypto-2.4.1.tar.gz

    http://pypi.python.org/packages/source/p/pycrypto/pycrypto-2.0.1.tar.gz#md5=277aa00f27cfbb08f21063f4beb6de59

    1.3、安装

    1、安装pycrypto

    $ tar -zxvf pycrypto-2.0.1.tar.gz $ cd pycrypto-2.0.1 $ python setup.py build $ sudo python setup.py install

    2、安装paramiko $ tar -zxvf paramiko-1.7.6.tar.gz $ cd paramiko-1.7.6 $ python setup.py build $ sudo python setup.py install

    1.4、可能遇到的问题及解决「基于CentOS,Python 2.4.3 」

    如果在安装pycrypto2.0.1时发生如下错误

    view plain <strong>[/pycrypto-2.0.1]$ sudo python setup.py build running build running build_py running build_ext building 'Cryp to.Hash.MD2' extension gcc -pthread -fno-strict-aliasing -DNDEBUG -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector ——param=ssp-buffer-size=4 -m64 -mtune=generic -D_GNU_SOURCE -fPIC -fPIC -Isrc/ -I/usr/include/python2.4 -c src/MD2.c -o build/temp.linux-x86_64-2.4/src/MD2.o unable to execute gcc: No such file or directory error: command 'gcc' failed with exit status 1</strong>解决方案1:

    可能是缺少pyton-dev安装包导致

    $  yum list | grep python-dev

    $ yum -y install python-dev*     「需root权限执行」

    执行后,重新安装即可成功。

    解决方案2:

    如果解决方案1还不能解决问题,可能是“gcc”没有安装或者不再PATH中

    $ whereis gcc         「检查gcc」

    $  echo $PATH        「检查gcc是否在PATH中」

    如果没有安装 “gcc” ,执行如下命令

    $ yum list | grep gcc

    $ sudo yum install -y gcc.x86_64

    执行后,重新安装即可。


    具体例子:

     

    #-*- coding: utf-8 -*-
    #!/usr/bin/python 
    import paramiko
    import threading
    
    def ssh2(ip,username,passwd,cmd):
        try:
            ssh = paramiko.SSHClient()
            ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            ssh.connect(ip,22,username,passwd,timeout=5)
            for m in cmd:
                stdin, stdout, stderr = ssh.exec_command(m)
    #           stdin.write("Y")   #简单交互,输入 ‘Y’ 
                out = stdout.readlines()
                #屏幕输出
                for o in out:
                    print o,
            print '%s	OK
    '%(ip)
            ssh.close()
        except :
            print '%s	Error
    '%(ip)
    
    
    if __name__=='__main__':
        cmd = ['cal','echo hello!']#你要执行的命令列表
        username = ""  #用户名
        passwd = ""    #密码
        threads = []   #多线程
        print "Begin......"
        for i in range(1,254):
            ip = '192.168.1.'+str(i)
            a=threading.Thread(target=ssh2,args=(ip,username,passwd,cmd))
            a.start() 


     

    上面的程序还是有些技巧的:

    1.利用多线程,同时发出登录请求,同时去连接电脑,这样速度快很多,我试了一下,如果不用多线程,直接一个一个挨着执行的话,大约5~10秒钟才能对一台电脑操作完,具体时间要根据命令的来决定,如果是软件安装或者卸载时间要更长一些。这样下来怎么也要一二十分钟,用多线程后就快多了,所有的命令执行完用了不到2分钟!

    2.最好用root用户登录,因为安装或者卸载软件的时候如果用普通用户又会提示输入密码,这样又多了一次交互,处理起来就比较麻烦!安装软件时apt-get install xxx 最好加上“-y”参数,因为有时安装或删除软件时提示是否继续安装或卸载,这又是一次自动交互!加上那个参数后就没有人机交互了。

    3. 循环时循环所有ip,因为计算机的ip是路由器自动分配的,保险起见,最好全部都执行,保证没有遗漏的主机

    4.远端执行命令时如果有交互,可以这样用 stdin.write("Y")来完成交互,“Y”就是输入“Y”。

    5.把所有的命令放到一个列表里面,遍历列表可以依次执行列表里面的命令

    6.为了更好的进行控制,最好在电脑上提前把root用户打开,装好ssh服务器并让其开机自动执行。


  • 相关阅读:
    根据group by、count case when 分组分类统计
    Cron表达式
    SQL分页查询 — 不同页面的查询结果有重复数据
    Dockerfile文件语法
    redis获取系统当前时间
    mybatis oracle批量插入数据
    Mysql函数->TRIM(去掉首尾空格、任意字符)
    Oracle函数->TRIM(去掉首尾空格、首尾字符)
    使用redis-list类型 限制用户1分钟内访问次数为100次
    一文了解mysql基础架构
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3278142.html
Copyright © 2011-2022 走看看