Python 学习笔记 - Paramiko 模块

Python提供了一个Paramiko模块,允许我们通过SSH 对远程系统进行操作,上传和下载文件。他的使用很直观,下面直接看例子。


例1

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
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author Yuan Li
import  paramiko
# 创建SSH对象
ssh  =  paramiko.SSHClient()
# 允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器
ssh.connect(hostname = 'host' , port = 22 , username = 'root' , password = '123' )
# 执行命令
stdin, stdout, stderr  =  ssh.exec_command( 'df -hT' )
# 获取命令结果
result  =  stdout.read()
print (result.decode())
# 关闭连接
ssh.close()
- - - - - - - - - -
"C:\Program Files\Python3\python.exe"  C: / Users / yli / pycharmprojects / Exercise / Week12 / paramiko_test.py
Filesystem               Type       Size  Used Avail Use %  Mounted on
/ dev / mapper / centos - root xfs         28G   6.5G    22G   24 %  /
devtmpfs                devtmpfs   988M      0   988M    0 %  / dev
tmpfs                   tmpfs      998M    80K   998M    1 %  / dev / shm
tmpfs                   tmpfs      998M   112M   887M   12 %  / run
tmpfs                   tmpfs      998M      0   998M    0 %  / sys / fs / cgroup
/ dev / sda1               xfs        497M   169M   329M   34 %  / boot
tmpfs                   tmpfs      200M    12K   200M    1 %  / run / user / 42
tmpfs                   tmpfs      200M      0   200M    0 %  / run / user / 0


如果看看ssh.connect()这个方法的源码,我们可以看见他实际上调用的是Transport这个类的方法。因此我们可以直接使用Transport来创建一个session,然后进行连接,效果和上面是一样的。


例2

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
import  paramiko
#创建一个transport session
transport  =  paramiko.Transport(( 'sydnagios' 22 ))
 
#连接session
transport.connect(username = 'root' , password = 'Goat2015' )
ssh  =  paramiko.SSHClient()
ssh._transport  =  transport
 
#执行命令
stdin, stdout, stderr  =  ssh.exec_command( 'df' )
print  (stdout.read().decode())
 
#创建sftp的对象
sftp = paramiko.SFTPClient.from_transport(transport)
 
#上传
sftp.put( 'c:\\temp\\aaa.txt' , '/tmp/aaa.txt' )
 
#下载
sftp.get( '/tmp/aaa.txt' , 'c:\\temp\\bbb.txt' )
transport.close()
- - - - - - - - - -
"C:\Program Files\Python3\python.exe"  C: / Users / yli / pycharmprojects / Exercise / Week12 / paramiko_test.py
Filesystem               Type       Size  Used Avail Use %  Mounted on
/ dev / mapper / centos - root xfs         28G   6.5G    22G   24 %  /
devtmpfs                devtmpfs   988M      0   988M    0 %  / dev
tmpfs                   tmpfs      998M    80K   998M    1 %  / dev / shm
tmpfs                   tmpfs      998M   112M   887M   12 %  / run
tmpfs                   tmpfs      998M      0   998M    0 %  / sys / fs / cgroup
/ dev / sda1               xfs        497M   169M   329M   34 %  / boot
tmpfs                   tmpfs      200M    12K   200M    1 %  / run / user / 42
tmpfs                   tmpfs      200M      0   200M    0 %  / run / user / 0



例3,我们可以完善一下例2,把这么操作都封装到自定义的类里

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import  paramiko
import  uuid
class  SSHConnection( object ):
 
     #初始化封装字段
     def  __init__( self , host = 'sydnagios' , port = 22 , username = 'root' ,pwd = '123' ):
         self .host  =  host
         self .port  =  port
         self .username  =  username
         self .pwd  =  pwd
         self .__k  =  None
     #连接session,执行操作,断开session
     def  run( self ):
         self .connect()
         pass
         self .close()
     #连接
     def  connect( self ):
         transport  =  paramiko.Transport(( self .host, self .port))
         transport.connect(username = self .username,password = self .pwd)
         self .__transport  =  transport
     #断开
     def  close( self ):
         self .__transport.close()
         
     #执行命令    
     def  cmd( self , command):
         ssh  =  paramiko.SSHClient()
         ssh._transport  =  self .__transport
         # 执行命令
         stdin, stdout, stderr  =  ssh.exec_command(command)
         # 获取命令结果
         result  =  stdout.read()
         return  result
     def  upload( self ,local_path, target_path):
         # 连接,上传
         sftp  =  paramiko.SFTPClient.from_transport( self .__transport)
         # 将location.py 上传至服务器 /tmp/test.py
         sftp.put(local_path, target_path)
ssh  =  SSHConnection()
ssh.connect()
r1  =  ssh.cmd( 'df' )
print (r1.decode())
ssh.upload( 'c:\\temp\\aaa.txt' "/home/yli/s7.py" )
ssh.close()
- - - - - - - - - -
"C:\Program Files\Python3\python.exe"  C: / s13课上代码 / s13day13课上代码 / s13day13_课上代码 / paramiko模块_demo.py
Filesystem               1K - blocks    Used Available Use %  Mounted on
/ dev / mapper / centos - root   28813572  6760732   22052840   24 %  /
devtmpfs                   1011616        0    1011616    0 %  / dev
tmpfs                      1021272       80    1021192    1 %  / dev / shm
tmpfs                      1021272   113928     907344   12 %  / run
tmpfs                      1021272        0    1021272    0 %  / sys / fs / cgroup
/ dev / sda1                   508588   172604     335984   34 %  / boot
tmpfs                       204256       12     204244    1 %  / run / user / 42
tmpfs                       204256        0     204256    0 %  / run / user / 0





本文转自 beanxyz 51CTO博客,原文链接:http://blog.51cto.com/beanxyz/1875644,如需转载请自行联系原作者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值