python远程操作linux服务器(获取ip,执行多条linux命令,上传文件)

首先安装模块:pip install paramiko

参考官方文档用法:http://docs.paramiko.org/en/2.0/api/client.html

获取linux服务器的ip,代码如下:

import paramiko
import re


class GetLinuxIp():
    '''获取linux服务器ip'''

    def __init__(self, hostname, port, username, password, cmds):
        '''

        :param hostname: linux主机的ip
        :param port: linux主机的端口
        :param username: linux主机登录用户名
        :param password: linux主机登录密码
        :param cmds: 需要执行的linux命令
        '''
        self.ip = hostname
        self.port = port
        self.user = username
        self.password = password
        self.cmds = cmds
        try:
            self.client = paramiko.SSHClient()   # 实例化客户端
            # 保存服务器的主机名和密钥信息
            self.client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            # 连接服务端,进行身份验证
            self.client.connect(self.ip, self.port, self.user, self.password, timeout=10)
            print("连接成功...")
        except Exception as e:
            # raise e
            print("连接失败,错误是{}".format(e))
            raise e

    def excute_command(self):
        '''执行命令'''
            # todo stdin是标准输入文件,stdout是标准输出文件,stderr标准出错文件,应用在输出的重新定位上。
        self.stdin, self.stdout, self.stderr = self.client.exec_command(self.cmds)

    def get_result(self):
        '''获取结果'''
        result = self.stdout.read().decode()
        pattern = re.compile(r'((2(5[0-5]|[0-4]d))|[0-1]?d{1,2})(.((2(5[0-5]|[0-4]d))|[0-1]?d{1,2})){3}')
        self.ip = pattern.search(result).group()
        print("获取到linux服务器的ip是:{}".format(self.ip))

    def __del__(self):
        '''关闭连接'''
        self.client.close()
        print("连接关闭...")


if __name__ == '__main__':
    linux = GetLinuxIp("121.196.120.113", 22, "root", "123_Xiaohaikun", "ifconfig")
    linux.excute_command()
    linux.get_result()

运行结果如图:

 执行多条linux命令,多条命令放在一个单引号下面,各命令之间用分号隔开,如:cmd_str = "cd /;cd etc;ls -l;" 且在末尾加上get_pty=True

demo如下:

import paramiko


def remot_connect(hostname, port, username, password, cmd_str):
    # 创建SSHClient 实例对象
    ssh = paramiko.SSHClient()
    # 调用方法,表示没有存储远程机器的公钥,允许访问
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    # 连接远程机器,地址,端口,用户名密码
    ssh.connect(hostname, port, username, password, timeout=10)
    # 输出命令执行结果
    stdin, stdout, stderr = ssh.exec_command(cmd_str, get_pty=True)
    result = stdout.read()
    print(result.decode())

    # 关闭连接
    ssh.close()


if __name__ == '__main__':
    hostname = "121.196.120.113"
    port = 22
    username = "root"
    password = "123_Xiaohaikun"
    cmd_str = "cd /;cd etc;ls -l;"
    remot_connect(hostname, port, username, password, cmd_str)

代码运行结果如图:

xshell上显示如图:

 上传文件:

demo如下:

import paramiko
import datetime
import os


def upload(hostname, username, password, port, local_file_path, remote_path):
    '''

    :param hostname:
    :param username:
    :param password: 
    :param port:
    :param local_file_path: 本地文件路径
    :param remote_path: linux保存路径
    :return:
    '''
    try:
        t = paramiko.Transport((hostname, port))
        t.connect(username=username, password=password)
        sftp = paramiko.SFTPClient.from_transport(t)
        print('开始上传文件{}'.format(datetime.datetime.now()))

        try:
            sftp.put(local_file_path, remote_path)
        except Exception as e:
            sftp.mkdir(os.path.split(remote_path)[0])
            sftp.put(local_file_path, remote_path)
            print("从本地: {} 上传到linux目录下: {}".format(local_file_path, remote_path))
        print('文件上传成功 {} '.format(datetime.datetime.now()))
        t.close()
    except Exception as e:
        print(repr(e))


if __name__ == '__main__':
    hostname = '121.196.120.113'
    username = 'root'
    password = '123_Xiaohaikun'
    port = 22
    local_file_path = r'D:Video1.mp4'
    remote_path = os.path.join('/root/temp/', "1.mp4")
    upload(hostname, username, password, port, local_file_path, remote_path)

运行结果:

 

原文地址:https://www.cnblogs.com/xiamaojjie/p/13385223.html