如何使用 psexec 向远程计算机上启动的 cmd.exe 提供多个命令

Posted

技术标签:

【中文标题】如何使用 psexec 向远程计算机上启动的 cmd.exe 提供多个命令【英文标题】:How to feed multiple command to cmd.exe initiated on remote machine using psexec 【发布时间】:2013-11-20 07:00:43 【问题描述】:

我正在尝试使用 psexec 连接到远程计算机并执行 cmd.exe。一旦我打开了这个会话,我想运行多个命令,例如 mkdir、del 等。我面临的问题是我只能运行一个带有子进程的命令作为通信关闭管道。有什么办法可以完成吗?

from subprocess import Popen, PIPE, STDOUT

class WsRPC():
    def __init__(self):
        self.rpc_exec_path = r'C:\SysinternalsSuite\psexec.exe'
        self.user = 'administrator'
        self.ip = '172.xxx.xxx.xxx'
        self.password = 'XxXxXxXx'
        self.session = ''

    def wsConnect(self):
        pass
    def runCommand(self):
        try:             

            self.session = Popen([self.rpc_exec_path, '\\\\' + self.ip,  '-u',
                                 self.user,  '-p', self.password, 'cmd.exe'],
                                 stdin = PIPE,stdout = PIPE,stderr = PIPE,
                                 shell = True)
            command = 'cmd.exe /c dir'
            self.session.stdin.write('dir/r/n')
            strout, strerr = self.session.communicate()
            print strout
            print strerr
        except Exception,e:
            print str(e)

obj = WsRPC()
obj.runCommand()

当我运行此代码时,我得到以下 o/p -

C:\SysinternalsSuite\psexec.exe \\172.xxx.xxx.xxx -u administrator 
-p XxXxXxXx cmd.exe
Microsoft Windows [Version 5.2.3790]


PsExec v2.0 - Execute processes remotely
Copyright (C) 2001-2013 Mark Russinovich
Sysinternals - www.sysinternals.com

Connecting to 172.xxx.xxx.xxx...


Starting PSEXESVC service on 172.xxx.xxx.xxx...


Connecting with PsExec service on 172.xxx.xxx.xxx...


Starting cmd.exe on 172.xxx.xxx.xxx...



cmd.exe exited on 172.xxx.xxx.xxx with error code 0.

看来我的“目录”不起作用。

PS:这种场景也要怎么调试?

【问题讨论】:

command = 'dir\r\n' 是做什么的?也许您需要换行符。 我也试过了,还是不行 当你自己在cmd中命令是否有效?会不会是网络延迟相关? @user 如果您在我使用 cmd.exe 运行命令时询问程序是否工作,那么答案是肯定的。它工作得很好。对于 n/w 延迟,我不确定如何调试它或发现它是相关的 self.session.stdin.write(command)之前需要time.sleep(5) 【参考方案1】:

我在本地做过:

>>> import subprocess
>>> s = subprocess.Popen(['cmd.exe'], stderr = subprocess.PIPE, stdin = subprocess.PIPE, stdout = subprocess.PIPE, )
>>> s.stdin.write('dir\r\n') # letting out '\r\n' does not run the command
>>> s.communicate()

我的问题是:当您对 psexec 执行相同操作时 - 它仍然有效吗?

使用字符串 connection_string 而不是列表可能会出现问题。 试试:

    添加 Popen(..., shell=True)

    使用列表。

    [self.rpc_exec_path, '\\\\' + self.ip,  '-u', self.user,  '-p', self.password, 'cmd.exe']
    

【讨论】:

我已按照您的要求更改了 popen,但我仍然无法通过管道输入

以上是关于如何使用 psexec 向远程计算机上启动的 cmd.exe 提供多个命令的主要内容,如果未能解决你的问题,请参考以下文章

如何使用本地计算机帐户作为 PSExec 的凭据

如何在远程计算机上执行vbs文件

psexec 远程计算机名

通过psexec实现远程安装软件包

PSEXEC 通过命令提示符成功运行,但在 ASP .Net/C# 中失败

如何在远程计算机上启动调试过程?