2016-12-16 73 views
0

我要检查,如果某个隧道使用(这些命令)从里面PHP存在:EXEC问题用netstat和lsof的

$(which lsof) -i -n | grep ssh 
$(which netstat) -a | grep "localhost:ssh" 

的问题是,当我运行的命令在shell一切罚款,但从PHP运行他们喜欢:

$reply = exec(CMD); 

总是什么都没有返回。

任何想法?

谢谢!

+0

我建议你呢? '哪个'会告诉你哪个可执行文件将被运行,如果你还没有包含路径的话。 – moopet

+0

@moopet出于执行exec调用的习惯。 “这”在这种情况下不应该有任何伤害。 –

+0

但是为什么你在exec调用中有这种习惯?我不明白。 – moopet

回答

0

您可以将stderr重定向到stdout并获取$output$return_var。要做到这一点,改变你的exec()调用是这样的:

exec('$(which lsof) -i -n | grep ssh 2>&1', $output, $return_var); 

var_dump($return_var); 
var_dump($output); 

更多关于这里的exec:http://php.net/manual/en/function.exec.php(看看$output$return_var参数)。

+0

谢谢。你的代码的结果: int(1) array(0){ } –

+0

好的,换句话说它不会返回任何东西。我刚刚测试过,它适用于我。你可以尝试用php cli来运行这个脚本吗? (运行'php -a'然后粘贴你的代码)。其他问题:什么是你的PHP版本,并启用safe_mode? –

+0

工作正常(用php -a):php> var_dump($ return_var); int(0) php> var_dump($ output); 阵列(1){ [0] => 串(112) “的ssh 20535未知3U的IPv4 5236207 0t0 TCP 192.168.2.100:36330->138.201.117.XXX:ssh(建立)” } PHP - v返回 PHP 7.0.8-3ubuntu3(cli)(NTS) Copyright(c)1997-2016 The PHP Group Zend Engine v3.0.0,Copyright(c)1998-2016 Zend Technologies Zend OPcache v7.0.8 -3ubuntu3,版权所有(c)1999-2016,由Zend Technologies和安全模式:php -i | grep safe sql.safe_mode => Off => Off –

0

我认为这个问题是更多的是与PHP怎样解释你的命令

在这种情况下(假设而不是CMD你写你的壳尝试相同的命令),它会尝试: $ reply = exec($(which lsof) -i -n | grep ssh); 表示它会尝试将粗体部分替换为PHP变量,并尝试执行结果字符串。由于“-i -n | grep ssh”的输出为空,所以你没有得到任何结果。为什么你使用`$(其中LSOF)`,而不是`lsof`

$lsof = exec(which lsof); 
$reply = exec($lsof -i -n | grep ssh); 
+0

不是。请阅读PHP文档和shell语法 –