通过pypsexec运行可执行文件后如何发送命令或数据?
解决方案
你当前使用的pypsexec库默认的run_executable是同步执行逻辑,启动远程程序时就会把传入的stdin一次性写入,程序执行完成才返回输出,本身不支持启动后动态发送输入。要实现该需求,可参考以下实现方式:
方法1:基于pypsexec的非阻塞调用改造
将run_executable的wait参数设为False,启动进程后会返回可操作的标准流管道对象,你就可以在进程运行过程中分次写入stdin数据,最后再等待进程执行完成获取输出。
修正后可运行的示例代码如下:
from pypsexec.client import Client import time c = Client("my_ip", username="myusername", password="mypassword") c.connect() try: c.create_service() # 启动进程时不等待执行完成,获取stdin/stdout/stderr管道 process = c.run_executable("app.exe", wait=False) # 程序启动后可先执行其他逻辑,此处示例等待1秒确保程序初始化完成 time.sleep(1) # 分次发送输入数据 process.stdin.write(b'first-input\n') process.stdin.flush() # 中间可插入任意业务逻辑,等待程序处理完成后再发下一段输入 time.sleep(2) process.stdin.write(b'second-input\n') process.stdin.flush() # 所有输入发送完成后关闭stdin,等待进程执行完成 process.stdin.close() process.wait() # 读取最终输出 stdout = process.stdout.read() stderr = process.stderr.read() rc = process.returncode print(stdout.decode('gbk')) # 中文Windows系统默认编码为gbk,可根据实际情况调整 finally: c.remove_service() c.disconnect()
注意:如果你的远程应用
app.exe默认开启了标准输入全缓冲,可能需要修改应用代码在每次读取前强制刷新缓冲区,或者启动时添加禁用缓冲的参数(比如Python脚本可以加-u参数启动),否则会出现写入stdin后程序没有实时响应的问题。
方法2:切换到交互式远程执行工具
如果你需要频繁做交互式的远程进程控制,也可以改用impacket库的wmiexec或者smbexec模块,对交互式输入的支持更完善。
内容的提问来源于stack exchange,提问作者salt
相关产品推荐
相关产品推荐

