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服务器并让其开机自动执行。


原文地址:https://www.cnblogs.com/keanuyaoo/p/3278142.html