如何在php shell_exec中使用“ dns-sd”命令?

时间:2019-04-02 13:51:04

标签: php shell-exec mdns

我正在尝试编写一个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无法终止的原因吗?

1 个答案:

答案 0 :(得分:0)

由于@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);
?>