gpt4 book ai didi

Python subprocess.call() 显然不适用于 psexec

转载 作者:行者123 更新时间:2023-12-01 05:04:04 30 4
gpt4 key购买 nike

我在使用 subprocess.call() 和 psexec 执行远程进程时遇到问题。我使用以下语法通过 subprocess.call() 远程执行进程:

def execute(hosts):
''' Using psexec, execute the script on the list of hosts '''
successes = []

wd = r'c:\\'
file = r'c:\\script.exe'
for host in hosts:
res = subprocess.call(shlex.split(r'psexec \\%s -e -s -d -w %s %s ' % (host,wd,file)), stdin=None, stdout=None, stderr=None)
if res == 0:
successes.append(host)
else:
logging.warning("Error executing script on host %s with error code %d" % (host, res))

print shlex.split(r'psexec \\%s -e -s -d -w %s %s ' % (hosts[0],wd,file))
return successes

如您所见,作为故障排除的一部分,我正在打印 shlex.split() 输出,以确保它是我想要的。此打印语句给出:

['psexec', '\\HOSTNAME', '-e', '-s', '-d', '-w', 'c:\\', 'c:\\script.exe']

这正是我所期望的。不幸的是,当我运行它时,我收到一条错误消息:

PsExec could not start \GN-WRK-02:
The system cannot find the file specified.

紧接着,我使用程序运行时应使用的确切语法运行 psexec 命令(根据 shlex.split() 输出判断),并且它工作得很好。我的语法是:

psexec \\HOSTNAME -e -s -d -w c:\\ c:\\script.exe

有什么想法为什么这行不通吗?如果重要的话,执行函数是通过两个或 3 个主机列表上的多处理的 map() 函数调用的。

任何帮助都会很棒!谢谢!

最佳答案

主机名前面的\\双斜杠只是一个斜杠;它被加倍以逃避斜杠。

您可以在 shlex.split() 输出中看到这一点:

['psexec', '\\HOSTNAME', '-e, '-s', '-d', '-w', 'c:\\', 'c:\\script.exe']

请注意,主机名之前的 \\ 只是两个反斜杠,就像 c:\\ 文件名值中的一样。。如果您只打印该值,您会发现 sart 处的反斜杠只是一个字符:

>>> print '\\HOSTNAME'
\HOSTNAME
>>> '\\HOSTNAME'[0]
'\\'
>>> '\\HOSTNAME'[1]
'H'

这是因为 shlex.split() 是一个 POSIX 工具,而不是 Windows 工具,它也将原始字符串中的 \\ 解释为转义符;如果您正在使用该工具,请再次将斜杠加倍:

shlex.split(r'psexec \\\\%s -e -s -d -w %s %s ' % (host,wd,file))

另一种方法可能是禁用 POSIX 模式,但我不完全确定它如何与 Windows 相互作用:

shlex.split(r'psexec \\%s -e -s -d -w %s %s ' % (host,wd,file), posix=False)

关于Python subprocess.call() 显然不适用于 psexec,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25434290/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com