我要检查,如果某个隧道使用(这些命令)从里面PHP存在:EXEC问题用netstat和lsof的
$(which lsof) -i -n | grep ssh
$(which netstat) -a | grep "localhost:ssh"
的问题是,当我运行的命令在shell一切罚款,但从PHP运行他们喜欢:
$reply = exec(CMD);
总是什么都没有返回。
任何想法?
谢谢!
我要检查,如果某个隧道使用(这些命令)从里面PHP存在:EXEC问题用netstat和lsof的
$(which lsof) -i -n | grep ssh
$(which netstat) -a | grep "localhost:ssh"
的问题是,当我运行的命令在shell一切罚款,但从PHP运行他们喜欢:
$reply = exec(CMD);
总是什么都没有返回。
任何想法?
谢谢!
您可以将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
参数)。
谢谢。你的代码的结果: int(1) array(0){ } –
好的,换句话说它不会返回任何东西。我刚刚测试过,它适用于我。你可以尝试用php cli来运行这个脚本吗? (运行'php -a'然后粘贴你的代码)。其他问题:什么是你的PHP版本,并启用safe_mode? –
工作正常(用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 –
我认为这个问题是更多的是与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);
不是。请阅读PHP文档和shell语法 –
:
我建议你呢? '哪个'会告诉你哪个可执行文件将被运行,如果你还没有包含路径的话。 – moopet
@moopet出于执行exec调用的习惯。 “这”在这种情况下不应该有任何伤害。 –
但是为什么你在exec调用中有这种习惯?我不明白。 – moopet