zoukankan      html  css  js  c++  java
  • 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)

    运行结果:

     

  • 相关阅读:
    python基础:8.正则表达式
    [Unity工具]批量修改字体
    产品理念(微博和Twitter)
    个性化推荐技术漫谈
    谱聚类算法(转自http://www.cnblogs.com/vivounicorn/archive/2012/02/10/2343377.html)
    Ubuntu输入正确密码后无法登录
    KMeans java实现(未用Hadoop版改进)
    Nutch安装指南
    KMeans的MapReduce实现
    特征向量的几何意义
  • 原文地址:https://www.cnblogs.com/xiamaojjie/p/13385223.html
Copyright © 2011-2022 走看看