Linux 反勾号可以';t在变量中处理管道

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

我在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 | 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