如何在 php shell_exec 中使用 'dns-sd' 命令?
How do I use the 'dns-sd' command in a php shell_exec?
我正在尝试编写一个 php 脚本,它可以扫描网络以查找任何 mDNS 记录,并 return 结果。
'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 不是我最擅长的领域。
当我在终端中运行命令时,你可以看到这里,我几乎可以立即得到响应。
我注意到,当我在 mac 的终端中 运行 此命令时,我必须使用 Ctrl+C 终止响应 - 这可能是 shell_exec 的原因没有终止?
感谢@JensV 为我指出了这个答案,我设法让它工作了 -
<?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);
?>
我正在尝试编写一个 php 脚本,它可以扫描网络以查找任何 mDNS 记录,并 return 结果。
'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 不是我最擅长的领域。
当我在终端中运行命令时,你可以看到这里,我几乎可以立即得到响应。
我注意到,当我在 mac 的终端中 运行 此命令时,我必须使用 Ctrl+C 终止响应 - 这可能是 shell_exec 的原因没有终止?
感谢@JensV 为我指出了这个答案,我设法让它工作了 -
<?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);
?>