【问题标题】:Executing powershell script from Linux从 Linux 执行 powershell 脚本
【发布时间】:2013-10-30 04:55:03
【问题描述】:

我正在尝试使用 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。但我愿意接受任何有助于实现我的目标的解决方案(无论是否使用 ssh)。

如果有其他选择,我也愿意不使用 libexpect。基本上我可以用这种方法改变任何东西。我正在使用它,因为我不知道有任何其他方式可以按照预期(libexpect)将用户名/密码和命令发送到远程 shell。

只要满足我的主要目标,即自动执行 powershell 脚本/命令并获取它们的 stdout 和 stderr及其退出状态$?。请注意,我不需要文件指针本身,如果我能在 char[] 中获取 (就像 bash 中的 OUTPUT=$(ls)),我会非常高兴。

【问题讨论】:

    标签: c linux windows powershell expect


    【解决方案1】:

    一个(不是很方便)的解决方案:expect 的手册说:“如果 exp_loguser 不为零,expect 将任何输出从生成的进程发送到标准输出。” (here)。因此,如果您在管道的写入端临时重定向标准输出,则可以使用日志记录功能通过读取管道的读取端来实际拦截生成的进程的输出。输出可能会与输入混合(交互式程序用于回显其输入),因此您需要确定重定向流中的相关数据。

    【讨论】:

    • 似乎 exp_loguser 不是很有用,因为它只是将输出写入标准输出(或不写入)。但是当我抬头看这个时,我看到exp_logfile 似乎可以满足我的需要。我不确定它是否区分标准输出和标准错误。通过这个“如果 exp_logfile 也非零,则将相同的输出写入 exp_logfile 定义的流”,我相信,它只关心标准输出。但这是对我所拥有的东西的改进,我会试一试。谢谢:)
    • 嗯...我担心它会混淆&err :-(,因为它在内部使用伪终端。无论如何,“日志文件”选项可能会减轻您的工作。例如,您可以创建管道并使用 fdopen连接日志流上的写入部分。或者只是创建一个临时文件,这取决于您的需要。
    猜你喜欢
    • 2014-01-06
    • 2011-07-16
    • 2012-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-09
    • 2014-04-06
    • 2018-03-03
    相关资源
    最近更新 更多