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
转载于:https://blog.51cto.com/daixuan/1914691