SSH技术的理论知识就不做介绍了,在这里主要就是介绍Python针对SSH技术封装的两个模块:paramiko和sshtunnel。
paramiko可以实现执行远程命令,上传文件到远程,从远程下载文件。sshtunnel可以实现端口的绑定。
基于用户名和密码连接
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进行跳转登录MySQL
方式1
from sshtunnel import SSHTunnelForwarder
import MySQLdb
server = SSHTunnelForwarder(
ssh_address_or_host=('st',22), # 指定ssh登录的跳转机的address
ssh_username='wangwei01', # 跳转机的用户
ssh_password='xxx', # 跳转机的密码
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='xxx',
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原理与运用(二):远程操作与端口转发