python远程Linux操作文件

2021-10-13  本文已影响0人  逍遥_yjz

一、简介

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

二、使用

1、下载

pip3 install paramiko

2、模块使用

SSHClient:

远程连接分为两种:

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

**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()


上一篇下一篇

猜你喜欢

热点阅读