Linux 反勾号可以';t在变量中处理管道
我在bash中使用CAT命令时遇到了一个脚本问题 这项工作:Linux 反勾号可以';t在变量中处理管道,linux,bash,Linux,Bash,我在bash中使用CAT命令时遇到了一个脚本问题 这项工作: #!/bin/bash fil="| grep LSmonitor"; log="/var/log/sys.log "; lines=`cat $log | grep LSmonitor | wc -l`; echo $lines; 产出:139 这并不是: #!/bin/bash fil="| grep LSmonitor"; log="/var/log/sys.log "; string="cat $log $fil | w
#!/bin/bash
fil="| grep LSmonitor";
log="/var/log/sys.log ";
lines=`cat $log | grep LSmonitor | wc -l`;
echo $lines;
产出:139
这并不是:
#!/bin/bash
fil="| grep LSmonitor";
log="/var/log/sys.log ";
string="cat $log $fil | wc -l";
echo $string;
`$string`;
输出:
cat /var/log/sys.log | grep LSmonitor | wc -l
cat: opcion invalida -- 'l'
Pruebe 'cat --help' para mas informacion.
$fil在本例中是一个静态参数,但在实际脚本中,该参数是从html表单POST获取的,如果打印,我可以看到$fil的内容是正确的。在本例中,由于您将管道构建为字符串,您需要:
eval "$string"
但是不要这样做--有人可以轻松进入过滤器
; rm -rf *
然后你就用水管冲洗
如果需要基于正则表达式的过滤器,请让用户只需输入正则表达式,然后执行以下操作:
grep "$fil" "$log" | wc -l
在本例中,由于您正在以字符串形式构建管道,因此需要:
eval "$string"
但是不要这样做--有人可以轻松进入过滤器
; rm -rf *
然后你就用水管冲洗
如果需要基于正则表达式的过滤器,请让用户只需输入正则表达式,然后执行以下操作:
grep "$fil" "$log" | wc -l
在本例中,由于您正在以字符串形式构建管道,因此需要:
eval "$string"
但是不要这样做--有人可以轻松进入过滤器
; rm -rf *
然后你就用水管冲洗
如果需要基于正则表达式的过滤器,请让用户只需输入正则表达式,然后执行以下操作:
grep "$fil" "$log" | wc -l
在本例中,由于您正在以字符串形式构建管道,因此需要:
eval "$string"
但是不要这样做--有人可以轻松进入过滤器
; rm -rf *
然后你就用水管冲洗
如果需要基于正则表达式的过滤器,请让用户只需输入正则表达式,然后执行以下操作:
grep "$fil" "$log" | wc -l
尝试使用
eval
(取自)
它看起来像是在将|
解释为字符串,而不是管道,因此当它到达-l
时,它会将其视为试图将-l
传递到cat
而不是wc
其他答案概述了为什么你不应该这样做
grep LSmonitor/var/log/syslog | wc-l
将执行您需要的操作。尝试使用eval
(取自)
它看起来像是在将|
解释为字符串,而不是管道,因此当它到达-l
时,它会将其视为试图将-l
传递到cat
而不是wc
其他答案概述了为什么你不应该这样做
grep LSmonitor/var/log/syslog | wc-l
将执行您需要的操作。尝试使用eval
(取自)
它看起来像是在将|
解释为字符串,而不是管道,因此当它到达-l
时,它会将其视为试图将-l
传递到cat
而不是wc
其他答案概述了为什么你不应该这样做
grep LSmonitor/var/log/syslog | wc-l
将执行您需要的操作。尝试使用eval
(取自)
它看起来像是在将|
解释为字符串,而不是管道,因此当它到达-l
时,它会将其视为试图将-l
传递到cat
而不是wc
其他答案概述了为什么你不应该这样做
grep LSmonitor/var/log/syslog | wc-l
将满足您的需求。首先,请允许我说,这听起来是个非常糟糕的主意:
[…]在实际脚本中,参数是从html表单POST获取的[…]
您不应该允许shell运行POST请求的内容。这是一个巨大的攻击向量,你所需要的任何机制来保护它,可能并不像你想象的那么有效。
其次,|
内部变量不被视为特殊变量。这并不特定于反勾号。参数扩展(例如,将$fil
替换为| grep LSmonitor
)发生在命令解析和大部分处理之后。对参数扩展的结果进行了一点后处理(包括“分词”,这就是为什么$fil
相当于三个参数'|'grep LSmonitor
,而不是单个参数'| grep LSmonitor'
),但没有你描述的那么戏剧性。例如,这个:
pipe='|'
echo $pipe cat
打印此文件:
| cat
由于您的用例非常可怕,我有点不想解释如何做您想做的事情-我认为您最好不要这样做-但是由于堆栈溢出的答案是为了对更多的人有用,而不仅仅是原始海报,下面是一个如何做的示例。我鼓励OP不要继续读下去
首先,请允许我说,这听起来是一个非常糟糕的主意: […]在实际脚本中,参数是从html表单POST获取的[…] 您不应该允许shell运行POST请求的内容。这是一个巨大的攻击向量,你所需要的任何机制来保护它,可能并不像你想象的那么有效。 其次,
|
内部变量不被视为特殊变量。这并不特定于反勾号。参数扩展(例如,将$fil
替换为| grep LSmonitor
)发生在命令解析和大部分处理之后。对参数扩展的结果进行了一点后处理(包括“分词”,这就是为什么$fil
相当于三个参数'|'grep LSmonitor
,而不是单个参数'| grep LSmonitor'
),但没有你描述的那么戏剧性。例如,这个:
pipe='|'
echo $pipe cat
打印此文件:
| cat
由于您的用例非常可怕,我有点不想解释如何做您想做的事情-我认为您最好不要这样做-但是由于堆栈溢出的答案是为了对更多的人有用,而不仅仅是原始海报,下面是一个如何做的示例。我鼓励OP不要继续读下去
首先,allo