• Python操作远程机器


    操作远程机器主要使用的有paramiko,WMI(Windows Management Instrumentation),SMBConnection.

    paramiko

    paramiko使用SSH2协议操作远程机器,是Python语言写的一个模块。

    安装

    pip  install paramiko
    

    使用

    使用主要包括执行命令,上传文件和下载文件。

    连接

    有两种方式连接到linux服务器。
    方式一:

    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect("某IP地址",22,"用户名", "口令")
    

    方式二:

    t = paramiko.Transport(("主机","端口"))
    t.connect(username = "用户名", password = "口令")
    

    如果连接远程主机需要提供密钥,上面第二行代码可改为:

    t.connect(username = "用户名", password = "口令", hostkey="密钥")
    

    执行命令

    import paramiko
     
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect("某IP地址",22,"用户名", "口令")
    stdin, stdout, stderr = ssh.exec_command("你的命令")
    print stdout.readlines()
    ssh.close()
    

    上传文件

    import paramiko
    
    t = paramiko.Transport(("主机","端口"))
    t.connect(username = "用户名", password = "口令")
    sftp = paramiko.SFTPClient.from_transport(t)
    remotepath=’/var/log/system.log’
    localpath=’/tmp/system.log’
    sftp.put(localpath,remotepath)
    t.close()
    

    下载文件

    import paramiko
     
    t = paramiko.Transport(("主机","端口"))
    t.connect(username = "用户名", password = "口令")
    sftp = paramiko.SFTPClient.from_transport(t)
    remotepath=’/var/log/system.log’
    localpath=’/tmp/system.log’
    sftp.get(remotepath, localpath)
    t.close()
    

    参考链接

    WMI

    WMI(Windows Management Instrumentation)用于管理windows机器。以下实例功能是执行远程机器的bat文件。

    import wmi
    
    # 远程执行bat文件
    def call_remote_bat(ipaddress, username, password):
        try:
            pythoncom.CoInitialize()
            # 用wmi连接到远程服务器
            c = wmi.WMI(computer=ipaddress, user=username, password=password)
            filename = r"C:auto_login.bat"  # 此文件在远程服务器上
            # filename = r"C:agentdistmachine.exe"  # 此文件在远程服务器上
            cmd_callbat = r"cmd /c call %s" % filename
            c.Win32_Process.Create(CommandLine=cmd_callbat)  # 执行bat文件   Win32_Process.Create
            time.sleep(1)
        except:
            print('{}远程执行失败'.format(ipaddress))
    

    参考链接:wmi教程,wmi实例

    pysmb

    pysmb是客户端SMB /CIFS协议(SMB1和SMB2)的纯Python实现,它是便于在Windows机器之间进行文件共享和打印的底层协议,以及通过Samba服务器应用程序与Linux机器进行文件共享和打印。

    • 使用pip安装即可:pip install pysmb
    • 需安装Twisted依赖包: pip install Twisted

    简单使用

    创建一个访问对象,并建立连接.

    from smb.SMBConnection import *
    
    # username: 远程主机用户名  password: 远程主机密码
    # my_name: 本机主机计算机名 remote_name: 远程主机计算机名
    # ip: 远程主机ip
    conn = SMBConnection(username, password, my_name, remote_name)
    conn = conn.connect(ip)
    

    常用方法。

    • servuce_name: 共享文件夹的名称
    • path: 新文件夹(相对于)共享文件夹的路径。如果路径包含非英文字符,则必须使用unicode字符串来传递路径。
    • timeout: pysmb将等待的秒数。
    • file_obj: 具有写入方法的类文件对象。

    1. 创建新目录。

    conn.createDirectory(service_name,path)
    

    2. 删除空文件夹。

    conn.deleteDirectory(service_name,path)
    

    3. 删除文件。

    conn.deleteFiles(service_name,path_file_pattern,timeout=30)
    

    4. 重命名文件或文件夹。

    # old_path: 旧文件名  new_path: 新文件名
    conn.rename(service_name,old_path,new_path)
    

    5. 获取远程主机的共享资源列表。

    file_list = conn.listShares(timeout = 30)
    # 遍历获取共享文件名
    for file in file.list:
        print(file.name)
    

    6. 上传文件到远程主机。

    conn.storeFile(service_name,path,file_obj, timeout=30)
    

    实例

    from smb.SMBConnection import *
    
    def send_file(username, password, my_name, remote_name, ip, file_dir, file_dir_remote):
        """
        pysmb下发脚本
        :param username: 远程主机用户名
        :param password: 远程主机密码
        :param my_name: 本地计算机名
        :param remote_name: 远程计算机名
        :param ip: 远程ip
        :param file_dir: 要传输的文件夹本地地址
        :param file_dri_remote: 上传位置相对于c盘的路径
        :return: 
        """
        try:
            # 创建pysmb访问对象
            conn = SMBConnection(username, password, my_name, remote_name)
            # 创建pysmb连接
            conn.connect(ip)
            # 提取文件名或目录正则
            pattern = re.compile(r'.*/(.*)')
            # 读取文件对象
            file_obj = open(file_dir, 'rb')
            # 远程文件名
            file_name = file_dir_remote + pattern.search(file_dir).group(1)
            # 传输文件到远程主机
            conn.storeFile('C$', file_name, file_obj)
            file_obj.close()
        except:
            print('{}远程传输文件失败'.format(ip))
        time.sleep(1)
        call_remote_bat(ip, username, password)
        try:
            conn.deleteFiles('C$', file_name)
        except:
            print('{}远程删除文件失败'.format(ip))
        conn.close()
    

    参考链接

  • 相关阅读:
    R语言大小写字母转换
    SparkR(R on Spark)编程指南 含 dataframe操作
    SparkR(R on Spark)编程指南 含 dataframe操作
    R-table和tapply函数
    r table
    多变量频率统计——r
    R语言-查看加载包、卸除加载包及安装包与卸载包
    flask 电子邮件进阶实践-用模板发送163邮件 --
    flask 电子邮件Flask-Mail --
    数据库进阶实践-事件监听 --
  • 原文地址:https://www.cnblogs.com/suraer/p/8458463.html
Copyright © 2020-2023  润新知