【问题标题】:How do I use the 'dns-sd' command in a php shell_exec?如何在 php shell_exec 中使用“dns-sd”命令?
【发布时间】:2019-04-02 13:51:04
【问题描述】:

我正在尝试编写一个 php 脚本,它可以扫描网络以查找任何 mDNS 记录,并返回结果。

'dns-sd -B _roomcast-capi._tcp'

我正在使用 OSx - 据我了解,如果不安装额外的软件,此命令在 Windows 上不起作用。

问题是这个 unix 命令不能与 shell_exec 或类似的东西一起工作。PHP 只是挂起,我在等待一个不存在的响应。

我尝试通过 shell_exec()、exec()、system()、proc_open() 和 passthru() 运行命令 - 不知道它们的不同之处,但它们都有相同的结果.. 我也尝试过重定向 STDERR 输出,但这似乎没有什么不同。

我的尝试之一..

  $p = shell_exec("dns-sd -B _roomcast-capi._tcp 2>&1");
  echo($p);

又一次尝试……

  $descspec = array(
    0 => array("pipe", "r"),
    1 => array("pipe", "w"),
    2 => array("file", "error-output.txt", "a")
  );
  $process = proc_open('dns-sd -B _roomcast-capi._tcp', $descspec, $pipes);
  foreach($pipes as $pipe) {
    var_dump($pipe);
    // echo "$process<br />";
  }

我可以在这里列出我的其余尝试,但老实说,它们可能全都错了。PHP 不是我最擅长的领域。

你可以看到,当我在终端运行命令时,我几乎可以立即得到响应。

https://prnt.sc/n6fe9e

我注意到,当我在我的 Mac 上的终端中运行此命令时,我必须使用 Ctrl+C 终止响应 - 这可能是 shell_exec 没有终止的原因吗?

【问题讨论】:

  • 您对不终止的评论,这正是原因。您也从未提及运行 php 脚本时实际发生的情况(我假设它挂起?)
  • 是的,抱歉,脚本只是挂起,我没有任何回应。你知道我有什么方法可以强制它终止吗?
  • 您是否希望命令自行终止?
  • 这可能会有所帮助:stackoverflow.com/a/6144213/2232127
  • 是的,我想要它——我需要从中获取结果。无论这是否是我可以在执行后调用“x 秒”的方法,以终止并返回结果。或者我还能做些什么?

标签: php shell-exec mdns


【解决方案1】:

感谢@JensV 为我指出了这个答案 - https://stackoverflow.com/a/7149229/4357255

<?php
  $proc = proc_open('dns-sd -B _roomcast-capi._tcp', array(array('pipe', 'r'), array('pipe', 'w'), array('pipe', 'w')), $pipes);
  echo fread($pipes[1], 999999);
  $proc_status=proc_get_status($proc);
  $pid=trim(exec('ps h -o pid  --ppid '.$proc_status['pid']));
  exec('kill -s 9 '.$proc_status['pid']);
  exec('gdb -p '.$pid.' --batch -x /usr/share/gdb_null_descr');
  array_map('fclose',$pipes);
  proc_close($proc);
?>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    • 2013-12-06
    • 1970-01-01
    • 2013-01-01
    • 2018-05-26
    • 2016-03-01
    • 1970-01-01
    相关资源
    最近更新 更多