背景知识
paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接。paramiko支持Linux, MacOS X, Windows等平台通过SSH从一个平台连接到另外一个平台
。利用该模块,可以方便的进行ssh连接和sftp协议进行sftp文件传输
。
SSHClient类
SSHClient的作用类似于Linux的ssh命令,是对SSH会话的封装,该类封装了传输(Transport),通道(Channel)及SFTPClient建立的方法(open_sftp),通常用于执行远程命令。
Paramiko中的几个基础名词:
1、Channel
:是一种类Socket,一种安全的SSH传输通道;
2、Transport
:是一种加密的会话,使用时会同步创建了一个加密的Tunnels(通道),这个Tunnels叫做Channel;
3、Session
:是client与Server保持连接的对象,用connect()/start_client()/start_server()开始会话。
与 SSH 服务器的会话的高级表示。此类包装Transport、Channel和SFTPClient以处理身份验证和打开通道的大多数方面。一个典型的用例是:
import paramiko
def ssh_client():
#私钥的绝对路径
pkey_path = paramiko.RSAKey.from_private_key_file(r'/Users/.ssh/id_rsa')
# 创建一个实例化
ssh = paramiko.SSHClient()
# 加载系统HostKeys密钥
ssh.load_system_host_keys()
# 自动添加策略,保存远端主机的主机名和密钥信息,如果不添加,那么不在本地knows_hosts文件中记录的主机将无法连接,默认拒接
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#连接远端主机,此处不需要密码,为私钥文件
ssh.connect('103.115.**.**',port=22, username='username', pkey=pkey_path)
#执行命令
stdin, stdout,stderr = ssh.exec_command('show ip int br')
print(stdout.read().decode('utf-8'))
ssh.close()
if __name__ == '__main__':
ssh_client()
ssh.connect()
参数解释:
常用参数
hostname //远端主机,填写IP和域名都可以, 必填项
port=SSH_PORT //缺省为22端口
username=None //用于登陆远端主机使用的用户名
password=None //用于登陆远端主机使用的密码
pkey=None //使用私钥用于身份认证,也叫'免密'登陆
key_filename=None //使用私钥文件名
timeout=None //tcp连接超时时间
allow_agent=True //缺省允许连接到ssh代理
look_for_keys=True //缺省在~/.ssh中搜索私钥文件,默认为True 允许
compress=False //缺省没有开启压缩
SFTPClient类
SFTPCLient作为一个sftp的客户端对象,根据ssh传输协议的sftp会话,实现远程文件操作,如上传、下载、权限、状态。
from_transport(cls,t) //创建一个已连通的SFTP客户端通道
put(localpath, remotepath, callback=None, confirm=True) //将本地文件上传到远端主机
get(remotepath, localpath, callback=None) //从远端主机下载文件到本地
mkdir() //创建目录
remove() //删除目录
rename() //重命名目录
stat() //查看文件状态
listdir() //列出目录下的文件
连接实例,本地/服务器上传、下载文件
import os
import paramiko
class connect_ssh:
def connect(self, local_path, remote_path):
jumpbox_host_ip = "103.115.**.**"
ssh_user = "tina.huanght"
ssh_key_filename = os.getenv('HOME') + '/.ssh/id_rsa'
t = paramiko.Transport(jumpbox_host_ip, 22)
t.connect(username=ssh_user, pkey=ssh_key_filename)
sftp = paramiko.SFTPClient.from_transport(t)
sftp.put(localpath=local_path, remotepath=remote_path)
print("** Upload file successfully! **")
sftp.get(remotepath=remote_path, localpath=local_path)
print("** download file successfully! **")
t.close()
sftp.close()
print("Closed!")
if __name__ == '__main__':
remote_path = '/ldap_home/user/test_data/test_simple_data.csv'
local_path = '/Users/user/Downloads/testfolder/test_simple_data.csv'
server = connect_ssh(local_path, remote_path)