Python针对SSH技术的封装

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Xw_Classmate/article/details/52490354

SSH技术的理论知识就不做介绍了,在这里主要就是介绍Python针对SSH技术封装的两个模块:paramiko和sshtunnel。

paramiko可以实现执行远程命令,上传文件到远程,从远程下载文件。sshtunnel可以实现端口的绑定。


paramiko

基于用户名和密码连接

import paramiko
paramiko.util.log_to_file('paramiko.log') # 创建SSH连接日志文件(只保留前一次连接的详细日志,以前的日志会自动被覆盖)

ssh = paramiko.SSHClient()
# 读取known_hosts
ssh.load_system_host_keys()
# 允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器
ssh.connect(hostname='192.168.80.130', port=22, username='wv', password='meiyoumima')
# 执行命令
stdin, stdout, stderr = ssh.exec_command('ls')
# 获取命令执行结果
print stdout.read()
# 关闭连接
ssh.close()


基于密钥连接

import paramiko
paramiko.util.log_to_file('paramiko.log') # 创建SSH连接日志文件(只保留前一次连接的详细日志,以前的日志会自动被覆盖)

private_key = paramiko.RSAKey._from_private_key_file('RSAKey.cfg')
   
# 创建SSH对象
ssh = paramiko.SSHClient()
# 允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器
ssh.connect(hostname='192.168.80.130', port=22, username='wv', key=private_key)
# 执行命令
stdin, stdout, stderr = ssh.exec_command('df')
# 获取命令结果
print stdout.read()
# 关闭连接
ssh.close()


基于用户名和密码进行传送文件

import paramiko
paramiko.util.log_to_file('paramiko.log')

transport = paramiko.Transport(('192.168.80.130',22))

transport.connect(username='wv',password='meiyoumima')
   
sftp = paramiko.SFTPClient.from_transport(transport)
 
# paramiko.log 上传至服务器/home/wv/paramiko.log
sftp.put('paramiko.log', '/home/wv/paramiko.log')
 
# 将remove_path 下载到本地 local_path
sftp.get('/home/wv/dump.rdb', 'dump.rdb')
   
transport.close()


sshtunnel

使用sshtunnel进行跳转登录MySQL
方式1

from sshtunnel import SSHTunnelForwarder
import MySQLdb 

server =  SSHTunnelForwarder(
    ssh_address_or_host=('st',22), # 指定ssh登录的跳转机的address
    ssh_username='wangwei01', # 跳转机的用户
    ssh_password='wang9981WEI', # 跳转机的密码
    local_bind_address=('127.0.0.1',10000),# 本地绑定的端口
    remote_bind_address=('10.10.11.102',3306)) # 远程绑定的端口

server.start()
# 启动以后,操作本地的10000端口相当于操作10.10.11.102的3306端口

conn = MySQLdb.connect(host='127.0.0.1',# 此处必须是是127.0.0.1  
                   port=10000,# 本地绑定的端口
                   user='smzdm_post',
                   passwd='smzdmPost_162304',  
                   db='smzdm_yuanchuang')
cursor = conn.cursor()
cursor.execute("show tables")
print(server.local_bind_address)
print(len(cursor.fetchall()))
server.stop()


方式2

from sshtunnel import SSHTunnelForwarder
import MySQLdb 

with SSHTunnelForwarder(
    ssh_address_or_host=('106.75.61.77',22),
    ssh_username='wangwei01',
    ssh_password='wang9981WEI',
    remote_bind_address=('10.10.11.102',3306)) as server:
    
    conn = MySQLdb.connect(host='127.0.0.1',       #此处必须是是127.0.0.1  
                       port=server.local_bind_port,
                       user='smzdm_post',
                       passwd='smzdmPost_162304',  
                       db='smzdm_yuanchuang')
    cursor = conn.cursor()
    cursor.execute("show tables")
    print(server.local_bind_address)
    print(len(cursor.fetchall()))



ref:

http://www.cnblogs.com/xia520pi/p/3805043.html Python Paramiko模块安装和使用

http://blog.csdn.net/apache0554/article/details/43764199python的paramiko模块使用

http://blog.csdn.net/kwsy2008/article/details/51440952 python 使用mysqldb模块通过ssh隧道连接mysql

http://www.cnblogs.com/xiaozhiqi/p/5814564.html paramiko模块

http://www.ruanyifeng.com/blog/2011/12/ssh_port_forwarding.html SSH原理与运用(二):远程操作与端口转发

猜你喜欢

转载自blog.csdn.net/Xw_Classmate/article/details/52490354