前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python之ssh连接

python之ssh连接

作者头像
py3study
发布2020-01-08 18:08:27
2.5K0
发布2020-01-08 18:08:27
举报
文章被收录于专栏:python3python3

paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接。跟常用软件xshell 、xftp功能一样,但是可以连接多台服务器,进行复杂的操作。

paramiko是一个第三方模块,使用之前需要先安装pip install paramiko

paramiko主要包含核心组件,一个是SSHClient类,另一个是SFTPClient类

一、SSHClient类的主要函数:

1、Connect方法

Connect实现了远程SSH的连接并校验。

Connect(self,hostname,port,username,password,pkey,key_filename,timeout,allow_agent,look_for_keys ,compress)

参数含义:

Hostname  str :主机ip

Port  int :端口

Username  str:用户名

Password  str :密码

Pkey  pkey: 秘钥

Timeout  float: 超时时间

Allow_agent  boool :当为flase时,禁用连到ssh代理

Look_for_keys  bool : flase时,禁用在~/.ssh中搜索秘钥文件

Compress    bool : true时打开压缩。

2、exec_command方法

远程命令执行的方法

exec_command(self,command,bufsize=-1)

参数:

Command  str :命令串

Bufsize  int:文件缓冲区大小,默认-1没有限制

3、load_system_host_keys

加载本地公秘钥校验文件,默认为~/.ssh/known_hosts

 load_system_host_keys(self,filename)

fielname  str :制定远程主机公钥记录文件

4、set_missing_host_key_policy

连接主机没有本地主机秘钥或者HostKeys对象时策略,目前支持三种:AutoAddPolicy,RejectPolicy,WarningPolicy

AutoAddPolicy:自动添加主机名以及主机秘钥

RejectPolicy(默认):自动拒绝未知的主机名和秘钥

WarningPolicy: 用于记录一个未知主机秘钥的Python警告

ssh = paramiko.SSHClient()

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 简单实例

1 基于用户名和密码的 sshclient 方式登录

# 建立一个sshclient对象
ssh = paramiko.SSHClient()
# 允许将信任的主机自动加入到host_allow 列表,此方法必须放在connect方法的前面
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 调用connect方法连接服务器
ssh.connect(hostname='192.168.2.129', port=22, username='super', password='super')
# 执行命令
stdin, stdout, stderr = ssh.exec_command('df -hl')
# 结果放到stdout中,如果有错误将放到stderr中
print(stdout.read().decode())
# 关闭连接
ssh.close()

2 基于用户名和密码的 transport 方式登录 方法1是传统的连接服务器、执行命令、关闭的一个操作,有时候需要登录上服务器执行多个操作,比如执行命令、上传/下载文件,方法1则无法实现,可以通过如下方式来操作

# 实例化一个transport对象
trans = paramiko.Transport(('192.168.2.129', 22))
# 建立连接
trans.connect(username='super', password='super')

# 将sshclient的对象的transport指定为以上的trans
ssh = paramiko.SSHClient()
ssh._transport = trans
# 执行命令,和传统方法一样
stdin, stdout, stderr = ssh.exec_command('df -hl')
print(stdout.read().decode())

# 关闭连接
trans.close()

3 基于公钥密钥的 SSHClient 方式登录

# 指定本地的RSA私钥文件,如果建立密钥对时设置的有密码,password为设定的密码,如无不用指定password参数
pkey = paramiko.RSAKey.from_private_key_file('/home/super/.ssh/id_rsa', password='12345')
# 建立连接
ssh = paramiko.SSHClient()
ssh.connect(hostname='192.168.2.129',
            port=22,
            username='super',
            pkey=pkey)
# 执行命令
stdin, stdout, stderr = ssh.exec_command('df -hl')
# 结果放到stdout中,如果有错误将放到stderr中
print(stdout.read().decode())
# 关闭连接
ssh.close()

以上需要确保被访问的服务器对应用户.ssh目录下有authorized_keys文件,也就是将服务器上生成的公钥文件保存为authorized_keys。并将私钥文件作为paramiko的登陆密钥

4 基于密钥的 Transport 方式登录

# 指定本地的RSA私钥文件,如果建立密钥对时设置的有密码,password为设定的密码,如无不用指定password参数
pkey = paramiko.RSAKey.from_private_key_file('/home/super/.ssh/id_rsa', password='12345')
# 建立连接
trans = paramiko.Transport(('192.168.2.129', 22))
trans.connect(username='super', pkey=pkey)

# 将sshclient的对象的transport指定为以上的trans
ssh = paramiko.SSHClient()
ssh._transport = trans

# 执行命令,和传统方法一样
stdin, stdout, stderr = ssh.exec_command('df -hl')
print(stdout.read().decode())

# 关闭连接
trans.close()

二、SFTPClient类——实现远程操作文件

1、from_transport方法

创建一个已经连通的sftp客户端通道

2、put函数

上传文件到服务器

Put(self,localpath,remotepath,callback=none,confirm=none)

Localpath  str : 上传文件本地源

Remotepath  str : 远程路径

Callback(function(int,int)) 获取已经接受的字节数以及总传输字节数。

Confirm  bool : 文件上传完毕后是否调用start()函数,以便确认文件大小。

3、get方法

从远程主机端下载文件同put

4、其他方法

Mkdir 创建目录 sftp.mkdr(‘/home/user’,0755)

Remove 删除主机端指定目录 sftp.remove(‘/home/user’)

Rename 从命名服务端的文件或者目录 sftp.rename(“/home/test.sh”,”/home/newtest.sh”)

Listdir  获取远程SFTP服务器端指定的目录列表,返回list形式  sftp.listdir(“/home”)

Stat 获取远程主机指定文件信息 sftp.stat(“/home/test.sh”)

简单案例:

基于用户名密码上传下载:

 1 import paramiko
 2   
 3 transport = paramiko.Transport(('hostname',22))
 4 transport.connect(username='wupeiqi',password='123')
 5   
 6 sftp = paramiko.SFTPClient.from_transport(transport)
 7 # 将location.py 上传至服务器 /tmp/test.py
 8 sftp.put('/tmp/location.py', '/tmp/test.py')
 9 # 将remove_path 下载到本地 local_path
10 sftp.get('remove_path', 'local_path')
11   
12 transport.close()

基于公钥密钥上传下载:

 1 import paramiko
 2   
 3 private_key = paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa')
 4   
 5 transport = paramiko.Transport(('hostname', 22))
 6 transport.connect(username='wupeiqi', pkey=private_key )
 7   
 8 sftp = paramiko.SFTPClient.from_transport(transport)
 9 # 将location.py 上传至服务器 /tmp/test.py
10 sftp.put('/tmp/location.py', '/tmp/test.py')
11 # 将remove_path 下载到本地 local_path
12 sftp.get('remove_path', 'local_path')
13   
14 transport.close()
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-09-04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档