首页 > 其他 > 详细

paramiko-tools

时间:2019-11-11 18:57:57      阅读:86      评论:0      收藏:0      [点我收藏+]

own develop 

import paramiko
import os
import logging
import json
import unittest
from stat import S_ISDIR, S_ISREG

__author__ = ‘Chen Quan‘

logging.basicConfig(level=logging.ERROR,
                    format=‘%(asctime)s  - %(levelname)s -->%(funcName)s  at line %(lineno)d: \n %(message)s‘)
log = logging.getLogger()


class Paramiko_Sftp(object):

    def __init__(self, ip, port, user, pwd):
        self.port = port
        self.pwd = pwd
        self.user = user
        self.ip = ip
        self.sftp =self.sftp_client()
        self.ssh = self.ssh_client()

    def ssh_client(self):
        client = paramiko.SSHClient()
        client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        client.connect(self.ip, self.port, self.user, self.pwd)
        if client:
            return client


    def sftp_client(self):
        tp = paramiko.Transport(self.ip,self.port)
        tp.connect(username=self.user, password=self.pwd)
        sftp = paramiko.SFTPClient.from_transport(tp)
        return sftp


    def get_dir(self, dir):

        shell = "ls -l  %s | awk ‘{print $9}‘" % dir
        input, out, err = self.ssh.exec_command(shell)
        res, err = out.readlines(), err.read()
        if res:
            files_list = [i.strip(‘\n‘) for i in res if i.strip(‘\n‘)]
            return files_list
        if err:
            raise FileExistsError(err.decode("utf-8"))

    def cmd(self, shell: str):

        try:
            input, out, err =self.ssh.exec_command(shell, get_pty=True)
            res, err = out.readlines(), err.read()
            if res:
                i = ‘‘
                for j in res:
                    i = i + j
                log.info("call_back res:%s" % i)
                return i
            if err:
                log.info("call_back err: %s" % err.decode("utf-8"))
                return err.decode("utf-8")
        except Exception as f:
            log.error(f)


    def close(self):
        self.sftp.close()
        self.ssh.close()



    def  is_file(self,filepath):
        try:
            result = S_ISREG(self.sftp.stat(filepath).st_mode)
        except IOError:  # no such file
            result = False
        return result


    def  is_dir(self,dir):

        try:
            result = S_ISDIR(self.sftp.stat(dir).st_mode)
        except IOError:     # no such file
            result = False
        return result

    def exists(self, remote_path):

        return True if self.sftp.stat(remote_path) else False

    def touch(self,file):
        if self.exists(file):
            raise FileExistsError("%s already exist"%file)
        else:
            self.ssh.exec_command("touch %s"%file)

    def remove(self,file):
        if self.exists(file):
            self.sftp.remove(file)
        else:
            raise FileNotFoundError("NO %s SUCH FILE"%file)

    def rm(self,dir):
        if self.exists(dir):
            files=self.sftp.listdir(dir)
            for file  in files:
              fp=os.path.join(dir,file)
              if self.is_dir(fp):
                  self.rm(fp)
              else:
                  self.remove(fp)
            self.sftp.rmdir(dir)
        else:
            raise FileNotFoundError("no such %s dir "% dir )


    def list_dir(self,dir):
        return self.sftp.listdir(dir)

    def mkdir(self,dir):
        if self.exists(dir):
            self.rm(dir)
            self.mkdir(dir)
        else:
            self.mkdir(dir)


    def makedirs(self,remotedir,mode=777):
        if self.is_dir(remotedir):
            pass

        elif self.is_file(remotedir):
            raise OSError("a file with the same name as the remotedir, "
                          "‘%s‘, already exists." % remotedir)
        else:

            head, tail = os.path.split(remotedir)
            if head and not self.is_dir(head):
                self.makedirs(head, mode)

            if tail:
                self.sftp.mkdir(remotedir, mode=mode)

    def open(self,filename,mode,data=None):
        """read or write file on remote server,check if file not exists it will occur"""
        with  paramiko.Transport(self.ip,self.port).connect(username=self.user, password=self.pwd)as f:
            sftp = paramiko.SFTPClient.from_transport(f)
            if mode==‘r‘ or mode=="r+":
                with  sftp.open(filename,mode) as fp:
                    readlines=fp.readlines()
                return readlines
            elif mode==‘w‘ or mode =="w+":
                with  sftp.open(filename, mode) as fp:
                    fp.write(data)
            else:
                raise ValueError("check mode in [‘r‘, ‘r+‘,‘w‘, ‘w+‘] or filename exists!")

class TestSftp(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        ip = "192.168.110.151"
        port = 22
        user = "root"
        pwd = "admin"
        cls.client =Paramiko_Sftp(ip, port, user, pwd)
        log.info("start selfcheck method of sftp ")

    @classmethod
    def tearDownClass(cls):
        try:
            cls.client.close()
        except Exception as e:
            log.error(e)
        else:
            log.info("close all connections")
        log.info("finish all unittest selfcheck method of sftp ")

    def test_query_dir(self):
        """测试查询dir下dirs and files"""
        files = self.client.list_dir("/usr/local/listdir")
        self.assertIn(‘list.txt‘, files)

    def test_call_backstdout(self):
        shell = "ls -l /usr/local"
        readlines = self.client.cmd(shell)
        self.assertIn("redisdb", readlines)

    def test_exsitdir(self):
        a = self.client.exists("/usr/local")
        assert a == True

    def test_exsistfile(self):
        b = self.client.exists("/usr/local/redisdb/logs/redis.log")
        assert b == True

    def test_touch(self):
        """create file """
        path = "/usr/local/toutest.txt"
        self.client.touch(path)
        a = self.client.exists(path)
        self.assertEqual(a, True)
        self.client.remove(path)

    def test_userremove(self):
        """remove file """
        path = "/usr/local/tou.txt"
        self.client.touch(path)
        self.client.remove(path)
        a = self.client.exists(path)
        self.assertEqual(a, False)

    def test_mkandrm(self):
        """bug 已经存在目录无法直接mkdir"""
        self.client.mkdir("/usr/local/test1")
        self.client.rm("/usr/local/test1")


if __name__ == ‘__main__‘:
    unittest.main()

  

paramiko-tools

原文:https://www.cnblogs.com/SunshineKimi/p/11837309.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!