美文网首页
python远程Linux操作文件

python远程Linux操作文件

作者: 逍遥_yjz | 来源:发表于2021-10-13 14:40 被阅读0次

    一、简介

    paramiko是一个基于SSH用于连接远程服务器并执行相关操作(SSHClient和SFTPClinet,即一个是远程连接,一个是上传下载服务),使用该模块可以对远程服务器进行命令或文件操作,值得一说的是,fabric和ansible内部的远程管理就是使用的paramiko来现实。

    二、使用

    1、下载

    pip3 install paramiko
    

    2、模块使用

    SSHClient:

    远程连接分为两种:

    • (1)基于用户名密码连接
    • (2)基于公钥秘钥连接

    通过是用paramiko远程操作,其实本质也分为两种:

    • (1)只用SSHClient
    • (2)自己创建一个transport

    **Note: **
    基于SSHClient是传统的连接服务器、执行命令、关闭的一个操作,有时候需要登录上服务器执行多个操作,比如执行命令、上传/下载文件,上面方法则无法实现,可以通过如下方式来操作.

    # coding:utf-8
    import paramiko
    
    # 1. SSHClient 用户名 密码
    def SSHClient_userPassword():
        # 创建SSH对象
        ssh = paramiko.SSHClient()
        # 允许连接不在know_hosts文件中的主机
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        # 连接服务器
        ssh.connect(hostname='10.137.2.2', port=22, username='root', password='***')
        # 执行命令
        stdin, stdout, stderr = ssh.exec_command('cd /home/image_accept;ls')
    
        # 获取命令结果
        result = stdout.read()
        print(result) # b'2020\n2021\n'
        # 关闭连接
        ssh.close()
    
    # 2. SSHClient 基于公钥秘钥连接
    def SSHClient_rsa():
        # 添加公钥密钥文件
        private_key = paramiko.RSAKey.from_private_key_file('C:/Users/**/.ssh/id_rsa')
        # 创建SSH对象
        ssh = paramiko.SSHClient()
        # 允许连接不在know_hosts文件中的主机
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        # 连接服务器
        #ssh.connect(hostname='123.57.2.2', port=22, username='root', password='***')
        ssh.connect(hostname='123.57.2.2', port=22, username='root', pkey=private_key)
        # 执行命令
        # 执行多条命令时需要将各个命令用‘;’隔开,最后将get_pty设为True;如果是单条命令的则只传入命令即可
        stdin, stdout, stderr = ssh.exec_command('cd /home/image_accept;ls', get_pty=True)
        # 多条命令的话会将执行结果一起返回,所以建议遍历打印。也可以直接打印:print(stdout.read().decode('utf-8'))
        files = stdout.readlines()
        for i in files:
            # 打印执行反馈结果
            print(i.encode().decode('utf-8').split()[0])
        # 打印报错信息
        print(stderr.read().decode('utf-8'))
        # 关闭连接
        ssh.close()
    
    # 3. SSHClient 封装 Transport
    def Transport_userPassword():
        import paramiko
    
        transport = paramiko.Transport(('10.137.2.2', 22))
        transport.connect(username='root', password='***')
    
        ssh = paramiko.SSHClient()
        ssh._transport = transport
    
        stdin, stdout, stderr = ssh.exec_command('cd /home/image_accept;ls')
    
        #print(stdout.read()) # b'2021\n'
    
        files = stdout.readlines()
        print(files) # ['2021\n']
        for i in files:
            # 打印执行反馈结果
            #print(i.encode().decode('utf-8').split()) # ['2020', '2021']
            print(i.split()) # ['2021']
        # 打印报错信息
        # print(stderr.read().decode('utf-8')) # 打印出空
        transport.close()
    
    # 4. SSHClient 封装 Transport 基于公钥秘钥连接
    def Transport_rsa():
    
        # 添加公钥密钥文件
        private_key = paramiko.RSAKey.from_private_key_file('C:/Users/**/.ssh/id_rsa')
        transport = paramiko.Transport(('123.57.2.2', 22))
        transport.connect(username='root', pkey=private_key)
        ssh = paramiko.SSHClient()
        ssh._transport = transport
        # 允许连接不在know_hosts文件中的主机
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        # 执行命令
        # 执行多条命令时需要将各个命令用‘;’隔开,最后将get_pty设为True;如果是单条命令的则只传入命令即可
        stdin, stdout, stderr = ssh.exec_command('cd /home/image_accept;ls', get_pty=True)
        # 多条命令的话会将执行结果一起返回,所以建议遍历打印。也可以直接打印:print(stdout.read().decode('utf-8'))
        files = stdout.readlines()
        for i in files:
            # 打印执行反馈结果
            print(i.encode().decode('utf-8').split()[0])
        # 打印报错信息
        print(stderr.read().decode('utf-8'))
        # 关闭连接
        ssh.close()
    
    if __name__ == '__main__':
        # 1. SSHClient 用户名 密码
        SSHClient_userPassword()
    
        # 2. SSHClient 基于公钥秘钥连接
        SSHClient_rsa()
    
        # 3. SSHClient 封装 Transport
        Transport_userPassword()
    
        # 4. SSHClient 封装 Transport 基于公钥秘钥连接
        Transport_rsa()
    

    SFTPClient:

    用于连接远程服务器并进行上传下载功能。

    # coding:utf-8
    import paramiko
    
    # 1. 基于用户名密码上传下载
    def transport_user_put_get():
        import paramiko
    
        transport = paramiko.Transport(('10.37.2.2', 22))
        transport.connect(username='root', password='***')
    
        sftp = paramiko.SFTPClient.from_transport(transport)
        # 将123.txt 上传至服务器 /vrfct_test/test/123.txt
        sftp.put('file/123.txt', '/vrfct_test/test/123.txt')
        # 将 abc.txt 下载到本地 local_path
        sftp.get('/vrfct_test/test/abc.txt', 'file/abc.txt')
    
        transport.close()
    
    # 2. 基于公钥秘钥上传下载
    def transport_rsa_put_get():
    
        private_key = paramiko.RSAKey.from_private_key_file('C:/Users/**/.ssh/id_rsa')
    
        transport = paramiko.Transport(('123.57.2.2', 22))
        transport.connect(username='root', pkey=private_key)
    
        sftp = paramiko.SFTPClient.from_transport(transport)
        # 将123.txt 上传至服务器 /vrfct_test/test/123.txt
        sftp.put('file/123.txt', '/vrfct_test/test/123.txt')
        # 将 abc.txt 下载到本地 local_path
        sftp.get('/vrfct_test/test/abc.txt', 'file/abc.txt')
    
        transport.close()
    
    
    class SSHConnection(object):
    
        def __init__(self, host='10.37.2.2', port=22, username='root',pwd='***'):
            self.host = host
            self.port = port
            self.username = username
            self.pwd = pwd
            self.__k = None
    
        def run(self):
            self.connect()  # 连接远程服务器
            self.upload('file/123.txt', '/vrfct_test/test/23.txt')
            # 将本地的123.txt文件上传到远端服务器的remote_service/目录下并改名为23.txt
            self.cmd('df')  # 执行df 命令
            self.close()    # 关闭连接
    
        def connect(self):
            transport = paramiko.Transport((self.host, self.port))
            transport.connect(username=self.username, password=self.pwd)
            self.__transport = transport
    
        def close(self):
            self.__transport.close()
    
        def upload(self,local_path,target_path):
            sftp = paramiko.SFTPClient.from_transport(self.__transport)
            sftp.put(local_path,target_path)
    
        def cmd(self, command):
            ssh = paramiko.SSHClient()
            ssh._transport = self.__transport
            # 执行命令
            stdin, stdout, stderr = ssh.exec_command(command)
            # 获取命令结果
            files = stdout.readlines()
            for i in files:
                # 打印执行反馈结果
                print(i.encode().decode('utf-8').split()[0])
            return files
    
    if __name__ == '__main__':
        # 1. 基于用户名密码上传下载
        transport_user_put_get()
    
        # 2. 基于公钥秘钥上传下载
        transport_rsa_put_get()
    
        # 3. 实现远程命令执行和文件上传
        obj = SSHConnection()
        obj.run()
    
    
    

    相关文章

      网友评论

          本文标题:python远程Linux操作文件

          本文链接:https://www.haomeiwen.com/subject/leasoltx.html