操作远程机器主要使用的有paramiko,WMI(Windows Management
Instrumentation),SMBConnection.
Windows下的WMI程序
Windows Management
Instrumentation(WMI)是Windows驱动程序模型的一组扩展,提供了一个操作系统界面,通过该界面,检测组件可以提供信息和通知。WMI允许脚本语言(如VBScript)在本地和远程管理Microsoft
Windows个人计算机和服务器。WMI预安装在Windows Vista,Windows Server
2003,Windows XP,Windows Me和Windows 2000中。
paramiko
paramiko使用SSH2协议操作远程机器,是Python语言写的一个模块。
打开WMI服务界面
在开始-运行,输入services.msc,进入服务
wmi启动.png
启动界面:
WMI.png
本文介绍如何使用Python访问WMI,并假定您已经下载并安装了pywin32扩展模块和WMI
Python模块。WMI是基于pywin32库的扩展库,并且暴露了一些Python友好的界面,以适应有时凌乱的WMI脚本API。pywin32库运行依赖于相应的MSVC环境,同时,python版本需要与MSVC一致。
安装
pip install paramiko
连接
连接本地主机:
import wmi
c = wmi.WMI()
如果是连接其他主机,需要添加该主机名参数:
import wmi
c = wmi.WMI("other_machine")
使用
使用主要包括执行命令,上传文件和下载文件。
查询
wmi模块最常见的用处就是对系统的信息进行查询:
import wmi
c = wmi.WMI()
for os in c.Win32_OperatingSystem():
print os.Caption
'''
输出:
Microsoft Windows 7 旗舰版
'''
查询磁盘详细信息:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import wmi
def toGB(size):
return str(long(size)/1024**3) + "GB"
def disk():
c = wmi.WMI ()
#获取硬盘分区
for physical_disk in c.Win32_DiskDrive ():
for partition in physical_disk.associators ("Win32_DiskDriveToDiskPartition"):
for logical_disk in partition.associators ("Win32_LogicalDiskToPartition"):
print physical_disk.Caption, partition.Caption, logical_disk.Caption
disks = wmi.WMI ().Win32_LogicalDisk ()
disk()
for d in disks:
print d.Caption,\
"TotalSize:",toGB(d.Size),\
"FreeSize:",toGB(d.FreeSpace),\
"FreeRate:%0.2f%%"%(100.0 * long (d.FreeSpace) / long (d.Size))
连接
有两种方式连接到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:\agent\dist\machine.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))
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()