我已经想出了一个很酷的脚本,它将产生我需要的输出,但它只显示在屏幕上,所以我必须复制,然后粘贴命令才能执行它们。下面是我的脚本的缩写版本:
#!/bin/bash
runc=/etc/csf/csf.pl -d
for IP in `tail -400 iptext.txt`
do
cc=`geoiplookup $IP`
echo -e $runc $IP $cc | grep Algeria
echo -e $runc $IP $cc | grep Argentina
echo -e $runc $IP $cc | grep Armenia
echo -e $runc $IP $cc | grep Azerbaijan
echo -e $runc $IP $cc | grep Bolivia
echo -e $runc $IP $cc | grep Brazil
done
字符串
好的,它遍历iptext.txt中的IP地址列表,然后对每个IP地址进行geoIP查找,如果(在这个例子中)列表中有两个geoIP匹配,假设亚美尼亚和巴西,我将在shell窗口中看到这样的输出:
/etc/csf/csf.pl -d 46.162.242.17 GeoIP Country Edition: AM, Armenia
/etc/csf/csf.pl -d 200.147.38.50 GeoIP Country Edition: BR, Brazil
型
这很好,但我想要的不仅仅是输出,我实际上希望运行/etc/csf/csf.pl -d
命令,并在列表中阻止(只是)与国家名称匹配的行中的IP。
我已经尝试了各种各样的东西,用我有限的shell脚本知识,但到目前为止,似乎没有工作。那么,是否有一些选项的ECHO我错过了,实际上会运行命令,而不仅仅是打印出来的行?
7条答案
按热度按时间v09wglhw1#
把你的命令放在括号里,就像这样:
字符串
您也可以在命令前添加文本
型
例如
型
ddarikpa2#
一个不需要修改脚本的简单方法是将命令的输出管道到另一个bash示例。像这样:
字符串
-
告诉bash它应该从stdin读取命令。然而,如果你不是在寻找一个快速的解决方案,也可以动态地构建和执行命令。像这样:
型
idv4meu83#
你可以使用
eval
来执行一个字符串:字符串
af7jpaap4#
有一个bash内置的eval,它执行命令,就像它们在你的shell中输入一样。例如,在你的脚本中,你可以做以下事情:
字符串
这将在一个子shell中处理你的echo,输出将像你在shell中输入的那样执行。
参见下面的bash手册:
eval [arg ...]读取args并将其连接到单个命令中。然后shell读取并执行此命令,并将其退出状态作为eval的值返回。如果没有args,或者只有null参数,则eval返回0。
62lalag45#
字符串
上级命令对我有效
w8rqjzmb6#
使用
grep -E
和模式代替:字符串
说明:
echo
将打印命令但不执行它。只需省略它以实际执行命令。而且,不用运行脚本5次,而是使用
grep
一次搜索五种模式中的任何一种。你应该用
型
而不是反引号这样更安全
wlzqhblo7#
你应该像这样进一步管道这些
echo
和grep
命令:字符串
让我们以这个命令为例:
型
因此,我们只需要
AAA
:型
现在实际执行
echo AAA
:sh
或bash
型
xargs
个型
如果您实际上需要**打印和执行命令,则可以使用
tee
:型
或
型
xargs -t
的工作原理类似:型
xargs
和sh
/bash
可能并不总是按预期工作,例如:型
vs:
型
使用带有多个重定向的
tee
:型