paramiko 批量之行命令(pip install paramiko)

1、安装paramiko模块

[root@client ~]# yum install -y python-paramiko.noarch
python-paramiko-1.7.5-2.1.el6.noarch.rpm                    | 728 kB     00:00
运行 rpm_check_debug
执行事务测试
事务测试成功
执行事务
  正在安装   : python-paramiko-1.7.5-2.1.el6.noarch                            1/1
  Verifying  : python-paramiko-1.7.5-2.1.el6.noarch                            1/1

已安装:
  python-paramiko.noarch 0:1.7.5-2.1.el6

完毕!


2、paramiko通过SSHClient()方法,用户名和密码连接

In [14]: import paramiko

In [15]: ssh = paramiko.SSHClient()

In [19]: ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

In [20]: ssh.connect(hostname='112.65.140.132',username='root',password='******')

In [21]: ssh.exec_command('date')
Out[21]:
(<paramiko.ChannelFile from <paramiko.Channel 0 (open) window=2097152 -> <paramiko.Transport at 0x384ac90L (cipher aes128-ctr, 128 bits) (active; 1 open channel(s))>>>,
 <paramiko.ChannelFile from <paramiko.Channel 0 (open) window=2097152 -> <paramiko.Transport at 0x384ac90L (cipher aes128-ctr, 128 bits) (active; 1 open channel(s))>>>,
 <paramiko.ChannelFile from <paramiko.Channel 0 (open) window=2097152 -> <paramiko.Transport at 0x384ac90L (cipher aes128-ctr, 128 bits) (active; 1 open channel(s))>>>)

In [22]: sdin,stdout,stderr = ssh.exec_command('date')

In [23]: stdout.read()
Out[23]: 'Thu Jul 13 02:21:53 CST 2017\n'
In [24]: ssh.close()

3、paramiko通过SSHClient()方法,ssh key连接

In [27]: import paramiko

In [28]: ssh = paramiko.SSHClient()

In [29]: ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

In [30]: pkey_file = '/root/.ssh/id_rsa'

In [31]: key = paramiko.RSAKey.from_private_key_file(pkey_file,password='12345678')

In [32]: ssh.connect(hostname='localhost',username='root',pkey=key)

In [33]: sdin,stdout,stderr = ssh.exec_command('uptime')

In [34]: print stdout.read()
 20:25:43 up 425 days,  1:36,  1 user,  load average: 0.02, 0.04, 0.03

4、paramiko通过Tranport()方法,ssh key连接

In [1]: import paramiko

In [2]: paramiko.Transport(('127.0.0.1',22))
Out[2]: <paramiko.Transport at 0x33b2c90L (unconnected)>

In [3]: s = paramiko.Transport(('127.0.0.1',22))

In [6]:  pkey_file = '/root/.ssh/id_rsa'

In [7]:  key = paramiko.RSAKey.from_private_key_file(pkey_file)

In [8]: s.connect(username='root',pkey=key)

In [9]: sftp = paramiko.SFTPClient.from_transport(s)

In [10]: sftp.get('/etc/passwd','/tmp/abc.txt')

In [11]: cat /tmp/abc.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

In [12]: sftp .put('/etc/hosts','/tmp/aaaaaaaaa')
Out[12]: <SFTPAttributes: [ size=1775 uid=0 gid=0 mode=0100644 atime=1492430625 mtime=1492430625 ]>

In [13]: ls -l /tmp/aaaaaaaaa
-rw-r--r-- 1 root root 1775 4月  17 20:03 /tmp/aaaaaaaaa


paramiko并行之行命令date

[root@133 managehosts]# vim paramiko01.py
#!/usr/bin/env python
import paramiko
import threading
import sys
def ssh(host,cmd):
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    pkey_file = '/root/.ssh/id_rsa'
    key = paramiko.RSAKey.from_private_key_file(pkey_file,password='12345678')
    try:
        ssh.connect(hostname=host,username='root',pkey=key,timeout=5)
    except:
        print 'connection has some problems...'
        return 1
    stdin,stdout,stderr = ssh.exec_command(cmd)
    stdout = stdout.read()[:-1]
    stderr = stderr.read()[:-1]
    if stdout:
        print '%s: %s' % (host,stdout)
        ssh.close()
    else:
        print '%s: %s' % (host,stderr)
        ssh.close()

if __name__=='__main__':
    hosts = ['112.65.140.12','112.65.140.13']
    try:
        cmd = sys.argv[1]
    except IndexError:
        print '%s follow a command must be' % __file__
        sys.exit(1)
for host in hosts:
    ssh(host,cmd)
    
[root@133 managehosts]# python paramiko01.py  date
112.65.140.132: Fri Jul 14 21:58:24 CST 2017
112.65.140.133: 2017年 04月 19日 星期三 15:51:41 CST

等于执行了下面的两条ssh命令:
[root@133 managehosts]#ssh root@112.65.140.132  date
2017年 07月 14日 星期五 22:15:03 CST
[root@133 managehosts]# ssh root@112.65.140.133  date
2017年 04月 19日 星期三 16:09:43 CST


使用threading.Thread创建两个线程运行ssh命令

#!/usr/bin/env python

import paramiko
import threading
import sys

def ssh(host,cmd):
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    pkey_file = '/root/.ssh/id_rsa'
    key = paramiko.RSAKey.from_private_key_file(pkey_file,password='12345678')
    try:
        ssh.connect(hostname=host,username='root',pkey=key,timeout=5)
    except:
        print 'connection has some problems...'
        return 1
    stdin,stdout,stderr = ssh.exec_command(cmd)
    stdout = stdout.read()[:-1]
    stderr = stderr.read()[:-1]
    if stdout:
        print '%s: %s' % (host,stdout)
        ssh.close()
    else:
        print '%s: %s' % (host,stderr)
        ssh.close()

if __name__=='__main__':
    hosts = ['112.65.140.132','112.65.140.133']
    try:
        cmd = sys.argv[1]
    except IndexError:
        print '%s follow a command must be' % __file__
        sys.exit(1)
for host in hosts:
    t = threading.Thread(target=ssh, args=(host,cmd))
    t.start()
[root@133 managehosts]# python paramiko-threading01.py date
112.65.140.133: 2017年 04月 19日 星期三 16:14:26 CST
112.65.140.132: Fri Jul 14 22:21:10 CST 2017

使用multiprocessing创建进程池运行date命令

[root@133 managehosts]# vim paramiko-threading02.py +40
#!/usr/bin/env python

import paramiko
import multiprocessing
import sys

def ssh(host,cmd):
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    pkey_file = '/root/.ssh/id_rsa'
    key = paramiko.RSAKey.from_private_key_file(pkey_file,password='12345678')
    try:
        ssh.connect(hostname=host,username='root',pkey=key,timeout=5)
    except:
        print 'connection has some problems...'
        return 1
    stdin,stdout,stderr = ssh.exec_command(cmd)
    stdout = stdout.read()[:-1]
    stderr = stderr.read()[:-1]
    if stdout:
        print '%s: %s' % (host,stdout)
        ssh.close()
    else:
        print '%s: %s' % (host,stderr)
        ssh.close()

if __name__=='__main__':
    hosts = ['112.65.140.132','112.65.140.133']
    try:
        cmd = sys.argv[1]
    except IndexError:
        print '%s follow a command must be' % __file__
        sys.exit(1)
    pool = multiprocessing.Pool(processes=10)
    for host in hosts:
        pool.apply_async(func=ssh,args=(host,cmd))
    pool.close()
    pool.join()
[root@133 managehosts]# python paramiko-threading02.py date
112.65.140.133: 2017年 04月 19日 星期三 18:51:13 CST
112.65.140.132: Sat Jul 15 00:57:57 CST 2017


[root@133 managehosts]# vim paramiko-multiprocessing02.py
#!/usr/bin/env python

import paramiko
import multiprocessing
import sys
from optparse import OptionParser

def opt():
    parser = OptionParser("Usage: %prog -a cmmmand")
    parser.add_option('-a',
                      dest='addr',
                      action='store',
                      help='ip or iprange EX:192.168.1.1 or 192.168.1.1,192.168.1.2 or 192.168.1.1-191.168.1.100')
    options, args = parser.parse_args()
    return options, args

def ssh(host,cmd):
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    pkey_file = '/root/.ssh/id_rsa'
    key = paramiko.RSAKey.from_private_key_file(pkey_file,password='12345678')
    try:
        ssh.connect(hostname=host,username='root',pkey=key,timeout=5)
    except:
        print 'connection has some problems...'
        return 1
    stdin,stdout,stderr = ssh.exec_command(cmd)
    stdout = stdout.read()[:-1]
    stderr = stderr.read()[:-1]
    if stdout:
        print '%s: \t %s' % (host,stdout)
        ssh.close()
    else:
        print '%s: \t  %s' % (host,stderr)
        ssh.close()

def parseOpt(option):
    if ',' in option:
        hosts = option.split(',')
        return hosts
    elif '-' in option:
        ip_start, ip_end = option.split('-')
        ip_net = '.'.join(ip_start.split('.')[:-1])
        start = int(ip_start.split('.')[-1])
        end = int(ip_end.split('.')[-1]) + 1
        hosts = [ip_net + '.' + str(i)  for i in range(start,end)]
        return hosts
    elif ',' not in option or '-' not in option:
        hosts = [option]
        return hosts
    else:
        print "%s -h" %__file__


if __name__=='__main__':
    paramiko.util.log_to_file('/tmp/paramiko.log')
    options, args = opt()
    try:
        cmd = args[0]
    except IndexError:
        print '%s must be follow a command' %  __file__
        sys.exit(1)
    hosts = parseOpt(options.addr)
    pool = multiprocessing.Pool(processes=2)
    for host in hosts:
        pool.apply_async(func=ssh,args=(host,cmd))
    pool.close()
    pool.join()
[root@133 managehosts]# python paramiko-multiprocessing02.py -a 112.65.140.132-112.65.140.133 date
112.65.140.133: 	 2017年 04月 19日 星期三 21:36:19 CST
112.65.140.132: 	 Sat Jul 15 03:43:04 CST 2017
[root@133 managehosts]# python paramiko-multiprocessing02.py -a 112.65.140.132,112.65.140.133 date
112.65.140.133: 	 2017年 04月 19日 星期三 21:37:42 CST
112.65.140.132: 	 Sat Jul 15 03:44:27 CST 2017