美文网首页
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操作文件

    一、简介 paramiko是一个基于SSH用于连接远程服务器并执行相关操作(SSHClient和SFTPCline...

  • linux操作系统:基本指令

    linux操作系统:基本指令 远程登录linux系统 Xshell5(远程登录) XFtp5 (远程文件上传下载...

  • Linux 中 Oracle dmp 文件导入导出(转)

    远程工具连接到 Linux 进行操作,进行 Linux 上 dmp 文件的导入导出。 1.将用户 system 用...

  • linux服务器管理

    xftp图形化的文件资源管理 xshell远程命令操作linux服务器软件

  • ftp操作

    lftp操作:实现远程的windows系统和unix/linux系统上的文件交换 ftp:这个是专门用来传输文件的...

  • ssh & scp远程登陆与复制文件

    在使用linux时,经常要在两个linux之间复制文件,或者远程登陆,在linux下该如何操作?下面是个简单...

  • Linux 基础

    了解 Linux 的常用命令 远程登录 上传下载 系统目录 文件和目录操作 Linux 下的权限体系 压缩和打包 ...

  • linux完全卸载python

    前言:经过如下操作Linux自带的python版本也会都删除 1、卸载自动Python 2、删除残余文件

  • Jenkins 搭建Android自动打包环境

    操作环境 本地环境 MAC 远程环境 Linux 登录远程Linux 使用mac自带的terminal ssh登录...

  • linux SCP命令用法

    linux scp远程拷贝文件及文件夹

网友评论

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

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