我正在尝试使用C程序自动从Linux执行一些powershell脚本。我正在使用 libexpect 将命令发送到Windows并获取powershell终端的文件描述符并写入它以运行powershell脚本/命令。它工作正常。但我的要求是我希望能够从我的C程序中读取powershell脚本的输出。
C程序看起来像这样:
fd = exp_spawnl( "sh", "sh", "-c", "telent -l username machine", (char*)0);
exp_expectl( fd, exp_glob, "password: ", 1, exp_end);
write(fd, "password\r", NUM_BYTES);
exp_expectl( fd, exp_glob, ".*>", 1, exp_end);
write(fd, "powershell \path\script.ps1\r", NUM_BYTES);
如上所述,无法获取正在Windows上执行的powershell script.ps1
的stdout / stderr。
linux-windows-powershell-linux的整个设置在本地网络中。因此,我现在不太担心使用telnet。但我愿意接受任何有助于实现目标的解决方案(无论是否)。
如果有其他选项,我愿意不使用libexpect。基本上我可以用这种方法改变任何东西。我正在使用它,因为我不知道有任何其他方式将用户名/密码和命令发送到远程shell,如期望的那样(libexpect)。
我愿意接受关于在linux上编写expect / bash脚本的建议或者在Windows上使用一些动态的PowerShell脚本,只要我的主要目标得到满足,即自动执行powershell脚本/命令并获取它们的stdout和stderr及其退出状态$?
。请注意,我自己不需要文件指针,如果我能在char[]
中获取值(如bash中的OUTPUT=$(ls)
),我感到非常高兴。
答案 0 :(得分:1)
一个(不是很方便)解决方案:期望的手册说:“如果exp_loguser非零,则期望将生成的进程的任何输出发送到stdout。” (here)。因此,如果您暂时在管道的写入端重定向stdout,则可以使用日志记录功能通过读取管道的读取端来实际拦截生成的进程的输出。输出可能与输入混合(交互式程序用于回显输入),因此您可以在重定向流中识别相关数据。