Python操作远程机器
程序员文章站
2022-09-26 16:12:47
操作远程机器主要使用的有paramiko,WMI(Windows Management Instrumentation),SMBConnection. paramiko paramiko使用SSH2协议操作远程机器,是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:\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()