paramiko简介
-
paramiko是用Python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接。
-
paramiko主要是通过ssh协议对远程主机进行管理:包括执行远程主机CLI、上传和下载文件等。
安装paramiko模块
python -m pip install paramiko
paramiko命令参数详解
-
利用密码登陆方式批量执行命令
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
导入模块import paramiko实例化一个SSHClient对象s = paramiko.SSHClient()自动添加策略 #首次登陆用交互式确定(允许连接不在know_hosts文件中的主机)s.set_missing_host_key_policy(paramiko.AutoAddPolicy())要连接的主机地址信息s.connect(hostname='ip地址', port=端口号, username='用户名', password='密码')要执行的命令stdin, stdout, stderr = s.exec_command('执行的命令')查看命令的执行结果print(stdout.read()) |
-
利用公钥验证方式批量执行命令
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
首先建立公钥和私钥文件# ssh-keygen 上传本地的公钥到远程主机的.ssh/authorized_keys文件中# ssh-copy-id -i .ssh/id_rsa.pub root@ip 导入模块import paramiko实例化一个对象s = paramiko.SSHClient()自动添加策略 #首次登陆用交互式确定s.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 建立私钥文件连接key = paramiko.RSAKey.from_private_key_file('/root/.ssh/id_rsa') 通过私钥验证的方式登录远程主机s.connect(hostname='ip地址', port=端口号, username='用户名', pkey=key) 要执行的命令stdin, stdout, stderr = s.exec_command('执行的命令')查看命令的执行结果print(stdout.read()) |
-
从远程主机上传、下载文件
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
导入模块import paramiko#建立一个加密的传输管道s = paramiko.Transport(('ip地址',端口号))#建立连接s.connect(username='用户名',password='密码')#建立一个sftp客户端对象,通过ssh transport操作远程文件sftp = paramiko.SFTPClient.from_transport(s)#上传本地文件到远程主机sftp.put(localFile,remoteFile)#从远程主机下载文件到本地sftp.get(remoteFile,localFile)#关闭sftp连接s.close() |
脚本演示
-
局域网物理主机批量管理:执行命令
脚本还有很多瑕疵,只是作为参考练习,前提是所有主机的用户名、密码和端口号都要相同
例如:Username:root Password:redhat Port:22
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
[root@python script]# cat 02_paramiko_process.py #!/usr/bin/env python#coding:utf8from multiprocessing import Processimport paramikoimport sysUsername = 'root'Password = 'redhat'Port = 22def runCmd(ip,cmd): s = paramiko.SSHClient() s.set_missing_host_key_policy(paramiko.AutoAddPolicy()) try: s.connect(hostname=ip, port=Port, username=Username, password=Password) stdin, stdout, stderr = s.exec_command(cmd) result = stdout.read() print (ip,result,) except: print ('%s is not exists' % ip)def ipProcess(): try: cmd = sys.argv[1] for i in range(2,255): ip = '192.168.1.%s' % i p = Process(target=runCmd,args=(ip,cmd)) p.start() except IndexError: print ('please input a command.') if __name__ == '__main__': ipProcess() |
执行脚本:
|
1
|
[root@python script]# python 02_paramiko_process.py uptime |
截图部分返回结果:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
192.168.1.57 10:48:49 up 2:29, 0 users, load average: 0.00, 0.00, 0.00192.168.1.56 10:50:25 up 2:29, 0 users, load average: 0.00, 0.00, 0.00192.168.1.100 10:48:50 up 2:29, 0 users, load average: 0.00, 0.00, 0.00192.168.1.127 is not exists192.168.1.210 22:48:51 up 2:28, 0 users, load average: 0.00, 0.00, 0.00192.168.1.51 10:48:52 up 2:28, 0 users, load average: 0.00, 0.00, 0.00192.168.1.55 10:50:26 up 2:29, 0 users, load average: 0.00, 0.00, 0.00192.168.1.122 is not exists192.168.1.58 is not exists192.168.1.52 is not exists192.168.1.53 is not exists192.168.1.50 is not exists192.168.1.215 02:31:14 up 2:07, 4 users, load average: 4.75, 1.46, 0.82 |
-
局域网物理主机批量管理:执行上传、下载文件
这里只对批量上传做了演示,对于批量下载文件只是一行代码的更换就可以了,我也在脚本中添加了注释行。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
[root@python script]# cat 03_put_paramiko_process.py #!/usr/bin/env python#coding:utf8from multiprocessing import Processimport paramikoimport sysUsername = 'root'Password = 'redhat'Port = 22def sftpPut(ip): try: s = paramiko.Transport((ip,Port)) s.connect(username=Username,password=Password) sftp = paramiko.SFTPClient.from_transport(s) localFile = '/root/sync.sh' remoteFile = '/opt/sync.sh' sftp.put(localFile,remoteFile) #sftp.get(remoteFile,localFile) s.close() print ('%s put successful.' % ip) except: print ('%s not exists.' % ip)def ipProcess(): for i in range(2,255): ip = '192.168.1.%s' % i p = Process(target=sftpPut,args=(ip,)) p.start() if __name__ == '__main__': ipProcess() |
执行脚本:
|
1
|
[root@python script]# python 03_put_paramiko_process.py |
截图部分返回结果:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
192.168.1.55 put successful.192.168.1.181 not exists.192.168.1.198 not exists.192.168.1.200 not exists.192.168.1.207 not exists.192.168.1.209 not exists.192.168.1.57 put successful.192.168.1.51 put successful.192.168.1.56 put successful.192.168.1.233 not exists.192.168.1.127 not exists.192.168.1.100 put successful.192.168.1.210 put successful. |
登陆远程主机查看文件是否上传完成:
|
1
2
3
4
5
6
7
8
|
[root@python script]# ssh 192.168.1.51Address 192.168.1.51 maps to localhost, but this does not map back to the address - POSSIBLE BREAK-IN ATTEMPT!root@192.168.1.51's password: Last login: Wed Mar 11 11:04:30 2015 from 192.168.1.112[root@naginx ~]# ifconfig |grep inet |head -1 inet addr:192.168.1.51 Bcast:192.168.1.255 Mask:255.255.255.0[root@naginx ~]# ll /opt/sync.sh -d-rw-r--r-- 1 root root 333 3月 11 11:05 /opt/sync.sh #已经成功上传文件 |
-
注意:
-
批量上传文件脚本只能满足单个文件,如何实现多个文件上传和下载呢?可以通过os模块来实现,下一篇文章中介绍如何以更人性化的方式实现参数上传下载,那就是os模块和optparse模块