paramiko模块
Paramiko模块
通过ssh远程链接服务器并执行响应的操作,类似于XShell
ps:ansible批量管理服务器工具,底层用的就是paramiko模块
安装
pip3 install paramiko
基本使用
远程链接服务器的方式
- 用户名和密码
- 公钥私钥的方式
paramiko上面两种方式都支持
执行命令
用户名和密码的方式
import paramiko # 创建SSH对象 ssh = paramiko.SSHClient() # 允许链接不在know_hosts文件中的主机 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 链接服务器 用户名和密码的方式 ssh.connect(hostname=‘10.0.0.200‘,port=22,username=‘root‘,password=‘123456‘) # 执行命令 stdin, stdout, stderr = ssh.exec_command(‘ls /‘) """ stdin可以用来输入额外的命令 stdout,stderr 正确和错误的返回结果 """ res = stdout.read() print(res.decode(‘utf-8‘)) # 关闭链接 ssh.close()
公钥私钥的方式
""" 首先你得生成你本地的公钥和私钥 以mac为例 1.生成 ssh-keygen -t rsa 2.将公钥拷贝到远程服务器 (如果本地已经有公钥就不用第一步,直接cd到你ssh文件的路径,然后执行下面代码) ssh-copy-id -i ~/.ssh/id_rsa.pub 用户名@服务器地址 eg: ssh-copy-id -i ~/.ssh/id_rsa.pub (写你自己的) 3.查看私钥 cat ~/.ssh/id_rsa """ # 公钥和私钥(先讲公钥保存到服务器上) import paramiko # 读取本地私钥 private_key = paramiko.RSAKey.from_private_key_file(‘a.txt‘) # 创建SSH对象 ssh = paramiko.SSHClient() # 允许连接不在know_hosts文件中的主机 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 连接服务器 ssh.connect(hostname=‘10.0.0.200‘, port=22, username=‘root‘, pkey=private_key) # 执行命令 stdin, stdout, stderr = ssh.exec_command(‘ls /‘) # 获取命令结果 result = stdout.read() print(result.decode(‘utf-8‘)) # 关闭连接 ssh.close()
上传下载文件
# 用户名和密码的方式
import paramiko
# 用户名和密码
transport = paramiko.Transport((‘10.0.0.200‘, 22))
transport.connect(username=‘root‘, password=‘123456‘)
sftp = paramiko.SFTPClient.from_transport(transport)
# 上传文件
sftp.put("a.txt", ‘/data/b.txt‘)  # 注意上传文件到远程某个文件下 文件目录必须存在
# 下载文件
# sftp.get(‘远程服务器文件路径‘, ‘本地文件路径‘)  # 将远程文件下载到本地并重新命令
transport.close()
# 公钥私钥的方式
import paramiko
private_key = paramiko.RSAKey.from_private_key_file(‘a.txt‘)
transport = paramiko.Transport((‘10.0.0.200‘, 22))
transport.connect(username=‘root‘, pkey=private_key)
sftp = paramiko.SFTPClient.from_transport(transport)
# 将location.py 上传至服务器 /tmp/test.py
# sftp.put(‘/tmp/location.py‘, ‘/tmp/test.py‘)
# 将remove_path 下载到本地 local_path
sftp.get(‘/data/b.txt‘, ‘hahaha.txt‘)
transport.close()思考:如果我限制即想执行命令又想上传下载文件,并且次数不限
我们自己对paramiko的代码进行一个封装
import paramiko
class SSHProxy(object):
    def __init__(self, hostname, port, username, password):
        self.hostname = hostname
        self.port = port
        self.username = username
        self.password = password
        self.transport = None
    def open(self):  # 给对象赋值一个上传下载文件对象连接
        self.transport = paramiko.Transport((self.hostname, self.port))
        self.transport.connect(username=self.username, password=self.password)
    def command(self, cmd):  # 正常执行命令的连接  至此对象内容就既有执行命令的连接又有上传下载链接
        ssh = paramiko.SSHClient()
        ssh._transport = self.transport
        stdin, stdout, stderr = ssh.exec_command(cmd)
        result = stdout.read()
        return result
    def upload(self, local_path, remote_path):
        sftp = paramiko.SFTPClient.from_transport(self.transport)
        sftp.put(local_path, remote_path)
        sftp.close()
    def close(self):
        self.transport.close()
    # with开始时自动触发
    def __enter__(self):
        # print(‘hahaha‘)
        self.open()
        return self
    # with代码块允许结束之后自动触发
    def __exit__(self, exc_type, exc_val, exc_tb):
        self.close()
        
# with一个对象的时候会自动触发对象的__enter__方法 并且该方法返回什么,as后面就拿到什么
with SSHProxy(‘10.0.0.200‘, 22, ‘root‘, ‘123456‘) as obj:
    # print(obj)
    obj.command()
    obj.upload()面试题
"""
题目:请在Context类中添加代码完成该类的实现
class Context:
	pass
with Context() as ctx:
	ctx.do_something()
"""
class Context:
  def __enter__(self,*args,**kwargs):
    return self
  
  def __exit__(self,*args,**kwargs):
    pass
  
  def do_something(self):
    pass
  
with Context() as ctx:
	ctx.do_something() 相关推荐
  lepton    2020-06-05  
   Jiajinjin    2020-05-18  
   LiHansiyuan    2020-04-15  
   sshong    2020-04-14  
   风吹草动    2020-03-27  
   SDUTACM    2020-03-05  
   hulao    2020-02-12  
   学习备忘录    2019-12-30  
   千锋    2020-01-02  
   jacktangj    2019-12-30  
   xiangqiao    2019-12-13  
   pythonxuexi    2019-12-10  
   huangzonggui    2019-12-03  
   hulao    2019-11-30  
   坚持是一种品质    2019-11-09  
   专注于Python    2019-10-24  
   Dlg    2019-10-23  
   zhuma的编程学习    2019-06-10  
 