paramiko模块
作者:互联网
paramiko是什么
paramiko包含两个核心组件:SSHClient和SFTPClient。
- SSHClient的作用类似于Linux的ssh命令,是对SSH会话的封装,该类封装了传输(Transport),通道(Channel)及SFTPClient建立的方法(open_sftp),通常用于执行远程命令。
- SFTPClient的作用类似与Linux的sftp命令,是对SFTP客户端的封装,用以实现远程文件操作,如文件上传、下载、修改文件权限等操作。
paramiko的基本使用
1.SSHClient常用的方法介绍
import paramiko
ssh = paramiko.SSHClient()
# 第一次连接的时候一般都会提示yes/no,这是因为远程服务器没有在know_hosts文件中记录时的应对策略
# set_missing_host_key_policy()设置连接的远程主机没有本地主机密钥或HostKeys对象时的策略,目前支持三种:
# AutoAddPolicy 自动添加主机名及主机密钥到本地HostKeys对象,不依赖load_system_host_key的配置。即新建立ssh连接时不需要再输入yes或no进行确认
# WarningPolicy 用于记录一个未知的主机密钥的python警告。并接受,功能上和AutoAddPolicy类似,但是会提示是新连接
# RejectPolicy 自动拒绝未知的主机名和密钥,依赖load_system_host_key的配置。此为默认选项
# 我一般使用第一种方式
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# connect():实现远程服务器的连接与认证,对于该方法只有hostname是必传参数
# 常用参数:
# hostname 连接的目标主机
# port=SSH_PORT 指定端口
# username=None 验证的用户名
# password=None 验证的用户密码
# pkey=None 私钥方式用于身份验证
# key_filename=None 一个文件名或文件列表,指定私钥文件
# timeout=None 可选的tcp连接超时时间
# allow_agent=True, 是否允许连接到ssh代理,默认为True 允许l
# ook_for_keys=True 是否在~/.ssh中搜索私钥文件,默认为True 允许
# compress=False, 是否打开压缩
ssh = connect(hostname='192.168.153.32' ,port='22', username='root', password='mypassword')
# exec_command():在远程服务器执行Linux命令的方法,他会返回一个元祖一共有三个值
# stdin
# stdout返回的是执行结果,如果执行失败stdout返回None
# stderr返回的是错误信息,如果命令执行成功stderr返回的是None
# stdout和stderr返回的都是字节,我们需要decode解码一下
stdin, stdout, stderr = ssh.exec_command('ls')
print(stdout.read().decode('utf-8'))
# open_sftp():在当前ssh会话的基础上创建一个sftp会话。该方法会返回一个SFTPClient对象。
# 利用SSHClient对象的open_sftp()方法,可以直接返回一个基于当前连接的sftp对象,可以进行文件的上传等操作.
sftp = client.open_sftp()
sftp.put('test.txt','text.txt')
由于工作需要自己封装了一个工具类,提供远程操作服务器,与上传文件。
import paramiko
class Ssh(object):
def __init__(self, ip, username="root", password=None, private_key_path=None, port=22):
# key = paramiko.RSAKey.from_private_key_file(private_key_path)
self.ssh = paramiko.SSHClient()
self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
self.ssh.connect(hostname=ip, port=port, username=username, password=password,key_filename=private_key_path)
# self.t = paramiko.Transport((ip,port))
# self.t.connect(username='root',pkey=key)
# self.sftp = paramiko.SFTPClient.from_transport(self.t)
def cmd(self,cmd):
_,stdout,stderr = self.ssh.exec_command(cmd)
msg = stdout.read().decode()
err = stderr.read().decode()
data = {
"code": 0,
"msg": ""
}
if len(err) != 0:
data['code'] = 1
data['msg'] = err
else:
data['code'] = 0
data['msg'] = msg
return data
def put(self, src, desc):
try:
sftp = self.ssh.open_sftp()
sftp.put(src,desc)
except Exception as e:
return e
ssh = Ssh(ip="192.168.153.32", private_key_path="C:\\Users\\Administrator\\.testssh\\linux_fyh_rsa", port=22)
# print(ssh.put("C:\\Users\\Administrator\\Desktop\\sh_auto\\test\\ssh_linux.py",'/root/ssh_linux.py'))
print(ssh.cmd('ls'))
标签:None,模块,self,sftp,ssh,key,paramiko 来源: https://www.cnblogs.com/bkhb/p/16541401.html