Python的ORM框架SQLAlchemy

本文详细介绍使用Python的pymysql库操作MySQL数据库的方法,包括执行SQL、获取自增ID及查询数据等。同时,介绍了Python的ORM框架SQLAlchemy的基本使用,包括底层处理和ORM功能。此外,还讲解了如何利用Paramiko模块实现SSH远程控制,包括基于用户名密码和公钥密钥的连接方式,以及上传下载操作。
部署运行你感兴趣的模型镜像

    今天主要是通过Python来对Mysql数据库进行操作,以及通过paramiko模块远程对主机进行操作,下面开始介绍今天的内容。

一、通过pymsql对数据库进行操作

    pymysql是Python中操作MySQL模块,其使用方法和MySQLdb几乎相同。

1、下载安装:
1
2
3
4
#源码安装:
   https: / / pypi.python.org / pypi / PyMySQL3
#pip安装:
   pip install pymysql
2、执行SQL:
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
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#Author:HaiFeng Di
 
 
import pymysql
 
#创建连接
conn = pymysql.connect(host = '127.0.0.1' ,port = 3306 ,user = 'root' ,passwd = '123456' ,db = 'mydata' )
 
#创建游标
cursor = conn.cursor()
 
#执行SQL语句,并返回受影响的行数
 
#单条数据更新操作
# effect_row = cursor.execute("update hosts set host = '192.168.1.8'")
 
#添加where条件
# effect_row = cursor.execute("update hosts set host = '192.168.1.8' where id > %s",(1,))
 
#插入多条数据
effect_row = cursor.executemany( "insert into hosts(id,host)values(%s,%s)" , [( 6 , "192.168.1.9" ),( 7 , "192.168.1.10" )])
 
#提交,不然无法保存新建或者修改过的数据
conn.commit()
 
#关闭游标
cursor.close()
 
#关闭连接
conn.close()
3、获取新创建数据自增ID
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
#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
import pymysql
 
#创建连接
conn = pymysql.connect(host = '127.0.0.1' ,port = 3306 ,user = 'root' ,passwd = '123456' ,db = 'mydata' )
 
#创建游标
cursor = conn.cursor()
 
#插入多条数据
effect_row = cursor.executemany( "insert into hosts(id,host)values(%s,%s)" , [( 6 , "192.168.1.9" ),( 7 , "192.168.1.10" )])
 
#提交,不然无法保存新建或者修改过的数据
conn.commit()
 
#关闭游标
cursor.close()
 
#关闭连接
conn.close()
 
#获取最新自增ID
new_id = cursor.lastrowid
print (new_id)
4、获取查询数据
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
#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
import pymysql
 
#创建连接
conn = pymysql.connect(host = '127.0.0.1' ,port = 3306 ,user = 'root' ,passwd = '123456' ,db = 'mydata' )
 
#创建游标
cursor = conn.cursor()
 
cursor.execute( "select * from hosts" )
 
# 获取第一行数据
# row_1 = cursor.fetchone()
# print(row_1)         #获取的结果以元组方式展示
 
# 获取前n行数据
# row_2 = cursor.fetchmany(3)
# print(row_2)
 
# 获取所有数据
row_3 = cursor.fetchall()
print (row_3)
 
#提交,不然无法保存新建或者修改过的数据
conn.commit()
 
#关闭游标
cursor.close()
 
#关闭连接
conn.close()

注:在fetch数据时按照顺序进行,可以使用cursor.scroll(num,mode)来移动游标位置,如:

  • cursor.scroll(1,mode='relative')     #相对当前位置移动;

  • cursor.scroll(2,mode='absolute')   #相对绝对位置移动。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
 
import pymysql
 
conn = pymysql.connect(host = '127.0.0.1' ,port = 3306 ,user = 'root' ,passwd = '123456' ,db = 'mydata' )
 
cursor = conn.cursor()
 
cursor.execute( "select * from hosts" )
 
cursor.scroll( 4 ,mode = 'relative' )    
# cursor.scroll(4,mode='absolute')  
row_1 = cursor.fetchone()
print (row_1)
 
conn.commit()
cursor.close()
conn.close()
5,fetch数据类型

    关于默认获取的数据类型是元组类型,如果想要转换成字典类型方便处理,请看下面代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
 
import pymysql
 
conn = pymysql.connect(host = '127.0.0.1' ,port = 3306 ,user = 'root' ,passwd = '123456' ,db = 'mydata' )
 
cursor = conn.cursor()
 
# 游标设置为字典类型
cursor = conn.cursor(cursor = pymysql.cursors.DictCursor)
cursor.execute( "select * from hosts" )
row_1 = cursor.fetchone()
print (row_1)
 
conn.commit()
cursor.close()
conn.close()
 
#结果:
{ 'id' : 1 , 'host' : '192.168.10.131' }

二、Python的ORM框架-SQLAlchemy

    SQLAlchemy是Python世界中最广泛使用的ORM工具之一,它采用了类似与Java里Hibernate的数据映射模型,而不是其他ORM框架采用的Active Record模型,SQLAlchemy分为两部分,一个是常用的ORM对象映射,另一个是核心的SQL expression。第一个很好理解,纯粹的ORM,后面这个不是ORM,而是DBAPI的封装,通过一些sql表达式来避免了直接写sql语句。简单的概括一下就是:将对象转换成SQL,然后使用数据API执行SQL并获取执行结果。

 下面来一下看一下SQLAlchemy的ORM的实现机制,内部封装了些什么:


 上图中的Dialect用于和数据API进行交流,根据配置文件的不同调用不同的数据库API,从而实现对数据库的操作,如:

1
2
3
4
5
6
7
8
9
10
11
12
13
MySQL - Python
     mysql + mysqldb: / / <user>:<password>@<host>[:<port>] / <dbname>
  
pymysql
     mysql + pymysql: / / <username>:<password>@<host> / <dbname>[?<options>]
  
MySQL - Connector
     mysql + mysqlconnector: / / <user>:<password>@<host>[:<port>] / <dbname>
  
cx_Oracle
     oracle + cx_oracle: / / user: pass @host:port / dbname[?key = value&key = value...]
  
更多详见:http: / / docs.sqlalchemy.org / en / latest / dialects / index.html
1、底层处理

    使用Engine、ConnectionPooling、Dialect进行数据库操作,Engine使用ConnectionPooling连接数据库,然后再通过Dialect执行SQL语句。

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
#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
from sqlalchemy import create_engine
 
 
engine = create_engine( "mysql+pymysql://root:123456@127.0.0.1:3306/mydata" , max_overflow = 5 )
 
#执行SQL
cur = engine.execute(
      "INSERT INTO hosts (id,host) VALUES ('1.1.1.22', 8)"
  )
 
# 新插入行自增ID
# cur.lastrowid
 
# 执行SQL
# cur = engine.execute(
#     "INSERT INTO hosts (host, color_id) VALUES(%s, %s)",[('1.1.1.22', 3),('1.1.1.221', 3),]
# )
 
 
# 执行SQL
# cur = engine.execute(
#     "INSERT INTO hosts (host, color_id) VALUES (%(host)s, %(color_id)s)",
#     host='1.1.1.99', color_id=3
# )
 
# 执行SQL
# cur = engine.execute('select * from hosts')
# 获取第一行数据
# cur.fetchone()
# 获取第n行数据
# cur.fetchmany(3)
# 获取所有数据
# cur.fetchall()

     这种方法底层实际是调用了上面的pymysql模块,没有实现通过实例化对象来对数据库进行操作。

2、ORM功能使用

    使用ORM、Schema Type、SQL Expression Language、Engine、ConnectionPooling、Dialect 所有组件对数据进行操作。根据类创建对象,对象转换成SQL,执行SQL。

创建表:

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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy import create_engine
 
#初始化数据库连接
engine = create_engine( "mysql+pymysql://root:123@127.0.0.1:3306/t1" , max_overflow = 5 )
 
#创建对象的基类
Base = declarative_base()
 
# 创建单表
class Users(Base):
     __tablename__ = 'users'                 #表名
     id = Column(Integer, primary_key = True #表结构
     name = Column(String( 32 ))
     extra = Column(String( 16 ))
 
     __table_args__ = (                      #设置索引
     UniqueConstraint( 'id' , 'name' , name = 'uix_id_name' ),
         Index( 'ix_id_name' , 'name' , 'extra' ),
     )
 
 
# 一对多
class Favor(Base):
     __tablename__ = 'favor'
     nid = Column(Integer, primary_key = True )
     caption = Column(String( 50 ), default = 'red' , unique = True )
 
 
class Person(Base):
     __tablename__ = 'person'
     nid = Column(Integer, primary_key = True )
     name = Column(String( 32 ), index = True , nullable = True )
     favor_id = Column(Integer, ForeignKey( "favor.nid" ))
 
 
# 多对多
class Group(Base):
     __tablename__ = 'group'
     id = Column(Integer, primary_key = True )
     name = Column(String( 64 ), unique = True , nullable = False )
     port = Column(Integer, default = 22 )
 
 
class Server(Base):
     __tablename__ = 'server'
 
     id = Column(Integer, primary_key = True , autoincrement = True )
     hostname = Column(String( 64 ), unique = True , nullable = False )
 
 
class ServerToGroup(Base):   #将前两张表做关联,创建外键
     __tablename__ = 'servertogroup'
     nid = Column(Integer, primary_key = True , autoincrement = True )
     server_id = Column(Integer, ForeignKey( 'server.id' ))
     group_id = Column(Integer, ForeignKey( 'group.id' ))
 
 
def init_db():
     """
     创建表
     :return:
     """
     Base.metadata.create_all(engine)
 
 
def drop_db():
     """
     删除表
     :return:
     """
     Base.metadata.drop_all(engine)
init_db()

操作表:

下面例子主要以单表操作为例,分别对数据库进行增删改查,请看下例:

  • 增加数据

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
#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy import create_engine
 
#初始化数据库连接
engine = create_engine( "mysql+pymysql://root:123456@127.0.0.1:3306/mydata" , max_overflow = 5 )
 
#创建对象的基类
Base = declarative_base()
 
# 创建单表
class Users(Base):
     __tablename__ = 'users'                   
     id = Column(Integer, primary_key = True )    
     name = Column(String( 32 ))
 
     __table_args__ = (                        
     UniqueConstraint( 'id' , 'name' , name = 'uix_id_name' ),
         Index( 'ix_id_name' , 'name' ),
     )
 
def init_db():
     Base.metadata.create_all(engine)
 
 
#创建DBSession类型:
DBSession = sessionmaker(bind = engine)
 
#创建session对象:
session = DBSession()
 
# 创建新User对象:
# new_user = Users(id='1', name='Bob')
#
# 添加到一条session:
# session.add(new_user)
 
#添加多条数据
session.add_all([
     Users( id = "2" , name = 'jack' ),
     Users( id = "3" , name = 'eric' ),
])
# 提交即保存到数据库:
session.commit()
 
# 关闭session:
session.close()
  • 删除数据

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
#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy import create_engine
 
#初始化数据库连接
engine = create_engine( "mysql+pymysql://root:123456@127.0.0.1:3306/mydata" , max_overflow = 5 )
 
#创建对象的基类
Base = declarative_base()
 
# 创建单表
class Users(Base):
     __tablename__ = 'users'
     id = Column(Integer, primary_key = True )
     name = Column(String( 32 ))
 
     __table_args__ = (
     UniqueConstraint( 'id' , 'name' , name = 'uix_id_name' ),
         Index( 'ix_id_name' , 'name' ),
     )
 
def init_db():
     Base.metadata.create_all(engine)
 
 
#创建DBSession类型:
DBSession = sessionmaker(bind = engine)
 
#创建session对象:
session = DBSession()
 
#删除id大于1的数据
session.query(Users). filter (Users. id > 1 ).delete()
 
# 提交即保存到数据库:
session.commit()
 
# 关闭session:
session.close()
  • 修改数据

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
#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy import create_engine
 
#初始化数据库连接
engine = create_engine( "mysql+pymysql://root:123456@127.0.0.1:3306/mydata" , max_overflow = 5 )
 
#创建对象的基类
Base = declarative_base()
 
# 创建单表
class Users(Base):
     __tablename__ = 'users'
     id = Column(Integer, primary_key = True )
     name = Column(String( 32 ))
 
     __table_args__ = (
     UniqueConstraint( 'id' , 'name' , name = 'uix_id_name' ),
         Index( 'ix_id_name' , 'name' ),
     )
 
def init_db():
     Base.metadata.create_all(engine)
 
 
#创建DBSession类型:
DBSession = sessionmaker(bind = engine)
 
#创建session对象:
session = DBSession()
 
 
# session.query(Users).filter(Users.id > 2).update({"name" : "henry"})
 
#修改id号,让其加99,结果id号为102
# session.query(Users).filter(Users.id > 2).update({Users.id: Users.id + "099"}, synchronize_session=False)
 
session.query(Users). filter (Users. id > 2 ).update({ "id" : Users. id + 1 }, synchronize_session = "evaluate" )
# 提交即保存到数据库:
session.commit()
 
# 关闭session:
session.close()
  • 查询数据

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
#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy import create_engine
 
#初始化数据库连接
engine = create_engine( "mysql+pymysql://root:123456@127.0.0.1:3306/mydata" , max_overflow = 5 )
 
#创建对象的基类
Base = declarative_base()
 
# 创建单表
class Users(Base):
     __tablename__ = 'users'
     id = Column(Integer, primary_key = True )
     name = Column(String( 32 ))
 
     __table_args__ = (
     UniqueConstraint( 'id' , 'name' , name = 'uix_id_name' ),
         Index( 'ix_id_name' , 'name' ),
     )
 
def init_db():
     Base.metadata.create_all(engine)
 
 
#创建session对象:
Session = sessionmaker(bind = engine)
session = Session()
#
# for name in session.query(Users).all():
#     print(name)
# ret = session.query(Users.id, Users.name).all()
# ret = session.query(Users).filter_by(name='jack').all()
ret = session.query(Users).filter_by(name = 'bob' ).first()
print (ret. id ,ret.name)
 
# 提交即保存到数据库:
session.commit()
 
# 关闭session:
session.close()
  • 更多数据库操作

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
57
58
59
60
# 条件
ret = session.query(Users).filter_by(name = 'alex' ). all ()
ret = session.query(Users). filter (Users. id > 1 , Users.name = = 'eric' ). all ()
ret = session.query(Users). filter (Users. id .between( 1 , 3 ), Users.name = = 'eric' ). all ()
ret = session.query(Users). filter (Users. id .in_([ 1 , 3 , 4 ])). all ()
ret = session.query(Users). filter (~Users. id .in_([ 1 , 3 , 4 ])). all ()
ret = session.query(Users). filter (Users. id .in_(session.query(Users. id ).filter_by(name = 'eric' ))). all ()
from sqlalchemy import and_, or_
ret = session.query(Users). filter (and_(Users. id > 3 , Users.name = = 'eric' )). all ()
ret = session.query(Users). filter (or_(Users. id < 2 , Users.name = = 'eric' )). all ()
ret = session.query(Users). filter (
     or_(
         Users. id < 2 ,
         and_(Users.name = = 'eric' , Users. id > 3 ),
         Users.extra ! = ""
     )). all ()
 
 
# 通配符
ret = session.query(Users). filter (Users.name.like( 'e%' )). all ()
ret = session.query(Users). filter (~Users.name.like( 'e%' )). all ()
 
# 限制
ret = session.query(Users)[ 1 : 2 ]
 
# 排序
ret = session.query(Users).order_by(Users.name.desc()). all ()
ret = session.query(Users).order_by(Users.name.desc(), Users. id .asc()). all ()
 
# 分组
from sqlalchemy.sql import func
 
ret = session.query(Users).group_by(Users.extra). all ()
ret = session.query(
     func. max (Users. id ),
     func. sum (Users. id ),
     func. min (Users. id )).group_by(Users.name). all ()
 
ret = session.query(
     func. max (Users. id ),
     func. sum (Users. id ),
     func. min (Users. id )).group_by(Users.name).having(func. min (Users. id ) > 2 ). all ()
 
# 连表
 
ret = session.query(Users, Favor). filter (Users. id = = Favor.nid). all ()
 
ret = session.query(Person).join(Favor). all ()
 
ret = session.query(Person).join(Favor, isouter = True ). all ()
 
 
# 组合
q1 = session.query(Users.name). filter (Users. id > 2 )
q2 = session.query(Favor.caption). filter (Favor.nid < 2 )
ret = q1.union(q2). all ()
 
q1 = session.query(Users.name). filter (Users. id > 2 )
q2 = session.query(Favor.caption). filter (Favor.nid < 2 )
ret = q1.union_all(q2). all ()

参考链接:

    http://docs.sqlalchemy.org/en/rel_1_0/orm/tutorial.html 

    http://www.pycoding.com/2016/03/07/sqlalchemy.html

三、Paramiko模块

    parmiko模块,基于SSH协议,用于链接远程服务器并执行相关操作。

1,安装使用

Paramiko安装很简单,可以使用pip直接安装:pip3 install paramiko,下面主要介绍一下如何使用:

SSHclient:用于连接远程服务器并执行基本命令

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
###############################基于用户名密码连接##############################
 
import paramiko
 
#创建SSH对象
ssh = paramiko.SSHClient()
 
#允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
 
#连接服务器
ssh.connect(hostname = '192.168.10.131' ,port = 22 ,username = 'haifeng' ,password = 'haifeng' )
 
#执行命令
stdin,stdout,stderr = ssh.exec_command( 'ls' )
 
#获取命令返回结果
result = stdout.readlines()
print (result)
 
#关闭连接
ssh.close()
 
#结果:
[ 'Desktop\n' , 'Documents\n' , 'Downloads\n' , 'examples.desktop\n' , 'memcached-1.4.29\n' , 'Music\n' , 'netdata-1.0.0\n' , 'netdata-1.0.0_(1).tar.gz\n' , 'Pictures\n' , 'Public\n' , 'python_script\n' , 'redis-3.0.6\n' , 'redis-3.0.6.tar.gz\n' , 'Templates\n' , 'Videos\n' ]

SSHclient封装Transport:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import paramiko
 
transport = paramiko.Transport(( '192.168.10.131' , 22 ))
transport.connect(username = 'haifeng' , password = 'haifeng' )
 
ssh = paramiko.SSHClient()
ssh._transport = transport
 
stdin, stdout, stderr = ssh.exec_command( 'df' )
print (stdout.read())
 
transport.close()
 
#结果:
b 'Filesystem     1K-blocks    Used Available Use% Mounted on\nudev              484420       0    484420   0% /dev\ntmpfs             100748   11616     89132  12% /run\n/dev/sda1       19478204 5967848  12497876  33% /\ntmpfs             503728     352    503376   1% /dev/shm\ntmpfs               5120       4      5116   1% /run/lock\ntmpfs             503728       0    503728   0% /sys/fs/cgroup\ntmpfs             100748      56    100692   1% /run/user/1000\n'

基于公钥密钥连接:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import paramiko
   
private_key = paramiko.RSAKey.from_private_key_file( '/home/auto/.ssh/id_rsa' )
   
# 创建SSH对象
ssh = paramiko.SSHClient()
# 允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器
ssh.connect(hostname = 'c1.salt.com' , port = 22 , username = 'wupeiqi' , key = private_key)
   
# 执行命令
stdin, stdout, stderr = ssh.exec_command( 'df' )
# 获取命令结果
result = stdout.read()
   
# 关闭连接
ssh.close()

SSHclient封装Transport:

1
2
3
4
5
6
7
8
9
10
11
12
13
import paramiko
 
private_key = paramiko.RSAKey.from_private_key_file( '/home/auto/.ssh/id_rsa' )
 
transport = paramiko.Transport(( 'hostname' , 22 ))
transport.connect(username = 'wupeiqi' , pkey = private_key)
 
ssh = paramiko.SSHClient()
ssh._transport = transport
 
stdin, stdout, stderr = ssh.exec_command( 'df' )
 
transport.close()

SFTPClient:用于连接远程服务器并执行上传下载操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
###############################基于用户名密码上传下载###########################
  
import paramiko
   
transport = paramiko.Transport(( '192.168.10.131' , 22 ))
transport.connect(username = 'haifeng' ,password = 'haifeng' )
   
sftp = paramiko.SFTPClient.from_transport(transport)
# 将location.py 上传至服务器 /tmp/test.py
sftp.put( '/tmp/location.py' , '/tmp/test.py' )
# 将remove_path 下载到本地 local_path
sftp.get( 'remove_path' , 'local_path' )
   
transport.close()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
###############################基于公钥密钥上传下载##############################
 
import paramiko
   
private_key = paramiko.RSAKey.from_private_key_file( '/home/auto/.ssh/id_rsa' )
   
transport = paramiko.Transport(( 'hostname' , 22 ))
transport.connect(username = 'wupeiqi' , pkey = private_key )
   
sftp = paramiko.SFTPClient.from_transport(transport)
# 将location.py 上传至服务器 /tmp/test.py
sftp.put( '/tmp/location.py' , '/tmp/test.py' )
# 将remove_path 下载到本地 local_path
sftp.get( 'remove_path' , 'local_path' )
   
transport.close()

​下面是一个上传下载的daemon供参考:

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
57
58
59
60
61
62
63
64
65
66
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import paramiko
import uuid
 
class SSHConnection( object ):
 
     def __init__( self , host = '172.16.103.191' , port = 22 , username = 'wupeiqi' ,pwd = '123' ):
         self .host = host
         self .port = port
         self .username = username
         self .pwd = pwd
         self .__k = None
 
     def create_file( self ):
         file_name = str (uuid.uuid4())
         with open (file_name, 'w' ) as f:
             f.write( 'sb' )
         return file_name
 
     def run( self ):
         self .connect()
         self .upload( '/home/wupeiqi/tttttttttttt.py' )
         self .rename( '/home/wupeiqi/tttttttttttt.py' , ' / home / wupeiqi / ooooooooo.py)
         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 upload( self ,target_path):
         # 连接,上传
         file_name = self .create_file()
 
         sftp = paramiko.SFTPClient.from_transport( self .__transport)
         # 将location.py 上传至服务器 /tmp/test.py
         sftp.put(file_name, target_path)
 
     def rename( self , old_path, new_path):
 
         ssh = paramiko.SSHClient()
         ssh._transport = self .__transport
         # 执行命令
         cmd = "mv %s %s" % (old_path, new_path,)
         stdin, stdout, stderr = ssh.exec_command(cmd)
         # 获取命令结果
         result = stdout.read()
 
     def cmd( self , command):
         ssh = paramiko.SSHClient()
         ssh._transport = self .__transport
         # 执行命令
         stdin, stdout, stderr = ssh.exec_command(command)
         # 获取命令结果
         result = stdout.read()
         return result
         
 
 
ha = SSHConnection()
ha.run()

对于更多限制命令,需要在系统中设置:

1
2
3
4
5
/ etc / sudoers
 
Defaults    requiretty
 
Defaults:cmdb    !requiretty



 

转载于:https://www.cnblogs.com/phennry/p/5716893.html

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值