转义shell_exec

时间:2018-02-24 13:24:54

标签: php escaping shell-exec

我可以运行:

echo shell_exec ("tail -n 500 /var/log/website.com_access_log | cut -d' ' -f1 | sort | uniq -c | sort -gr | head -10");   

但是我无法运行(在终端中运行):

echo shell_exec ("tail -n 500 /var/log/website.com_access_log | sed -e 's/^\([[:digit:]\.]*\).*\"\(.*\)\"$/\1 \2/' | sort | uniq -c | sort -gr | head -10");  

不返回任何内容或" 500" (这里有胡言乱语)

显然,它与逃避有关。在示例中,仅为PHP转义" 我尝试escapeshellarg()escapeshellcmd()但未成功(不返回任何内容)。还测试了使用\\, \\\, \\\\转义\。

这里有什么问题?我应该逃脱什么?

1 个答案:

答案 0 :(得分:1)

使用单引号解决问题。在第一个捕获组中添加:也可以获取IPv6地址。

echo shell_exec ('tail -n 500 /var/log/website.com_access_log | sed -e \'s/^\([[:digit:]:\.]*\).*\"\(.*\)\"$/\1 \2/\' | sort | uniq -c | sort -gr | head -10');

输出:

474 127.0.0.1 Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:58.0) Gecko/20100101 Firefox/58.0
 19 ::1 Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.xx (KHTML, like Gecko) Chrome/64.0.xxx.xxx Safari/xxx.xx
  7 ::1 Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.xx (KHTML, like Gecko) Ubuntu Chromium/64.0.xxx.xx Chrome/64.0.xxx.xxx Safari/xxx.xx