python 提交 命令到远程windows服务器并获取作业进程id
在Python中,你可以使用多种方式来提交命令到远程Windows服务器并获取作业进程ID。以下是几种常见的方法:
方法1:使用paramiko(SSH库)
paramiko是一个用于进行SSHv2的Python库,可以用来连接到远程服务器并执行命令。
首先,你需要安装paramiko:
pip install paramiko
然后,你可以使用以下代码连接到远程Windows服务器并执行命令:
import paramiko# 创建SSH对象
ssh = paramiko.SSHClient()
# 允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())# 连接服务器
ssh.connect(hostname='your_server_ip', port=22, username='your_username', password='your_password')# 执行命令并获取输出和进程ID(例如使用Windows的tasklist命令来获取PID)
stdin, stdout, stderr = ssh.exec_command('tasklist /FI "IMAGENAME eq cmd.exe" /FO CSV')
output = stdout.read().decode()
print(output)# 关闭连接
ssh.close()
方法2:使用pypsexec(适用于执行PowerShell命令)
如果你需要执行PowerShell命令或需要更高级的Windows管理任务,可以使用pypsexec。首先,安装pypsexec:
pip install pypsexec
然后,你可以使用以下代码:
from pypsexec import Service, EXECSVC_PORT, EXECSVC_PIPE_NAME, EXECSVC_PIPE_TIMEOUT, EXECSVC_PIPE_BUFSIZE, EXECSVC_PIPE_MAXINSTANCES, EXECSVC_PIPE_FIRSTINSTANCE, EXECSVC_PIPE_ACCESS, EXECSVC_PIPE_SHAREMODE, EXECSVC_PIPE_OPTIONS, EXECSVC_PIPE_MODE, EXECSVC_PIPE_SECURITYATTRIBUTES, EXECSVC_PIPE_CREATIONDISPOSITION, EXECSVC_PIPE_SECURITYQUALITYOFSERVICE, EXECSVC_PIPE_CREATIONDISPOSITION, EXECSVC_PIPE_SECURITYQUALITYOFSERVICE, pypsexec, EXECSVC_PIPE_SECURITYATTRIBUTES, EXECSVC_PIPE_SECURITYQUALITYOFSERVICE, pypsexec.psexec
from pypsexec import pypsexec as psexec
import win32con# 创建远程执行服务对象
service = Service(hostname='your_server', username='your_username', password='your_password')
service.connect()# 执行命令并获取输出和进程ID(例如使用PowerShell获取特定进程的PID)
result = service.execute('Get-WmiObject Win32_Process | Where-Object {$_.Name -eq "notepad.exe"} | Select-Object ProcessId')
print(result)# 关闭连接
service.disconnect()
方法3:使用winrm库(适用于WS-Management协议)
winrm是另一种与Windows远程管理相关的Python库,可以用来执行远程PowerShell命令。首先,安装winrm:
pip install winrm
然后,你可以使用以下代码:
from winrm.protocol import Protocol
import xml.etree.ElementTree as ET # 用于解析WS-Man返回的XML输出# 创建WinRM会话对象
session = Protocol(endpoint='http://your_server:5985/wsman', # 可能需要HTTPS和端口5986,取决于你的配置和证书情况transport='ntlm', # 或者 'kerberos',取决于你的认证方式username='your_username', password='your_password' # 明文密码或通过Kerberos认证时不需要提供密码(但需要配置Kerberos认证)
) # 对于Kerberos认证,可能需要额外的配置如realm等。 # session.transport.set_kerberos('<your-kerberos-principal>', '<your-keytab-path>') # Kerberos配置示例。 注释掉上面的password行。 # session.transport.set_kerberos_realm('<your-kerberos-realm>') # 如果需要设置Kerberos领域。 注释掉上面的password行。 # session.transport.set_kerberos_config('<path-to-krb5.conf>') # 如果需要指定Kerberos配置文件路径。 注释掉上面的password行