我已经想出了一个很酷的小脚本,它会生成我需要的输出,但是它只显示在屏幕上,所以我必须复制,然后粘贴命令来执行它们。 这里是我的脚本的缩写版本:
#!/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地址列表,然后在每个地方执行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的选项,我错过了实际运行命令,而不是只是打印出行?
非常感谢!
更新:没关系,我解决了eval函数的问题,如下所示:
eval“echo -e $ runc $ IP $ cc | grep阿尔及利亚”
一个不需要修改脚本的简单方法就是将命令的输出传送到另一个bash实例。 喜欢这个:
yourscript | bash -
-
告诉bash它应该从标准输入读取命令。
但是,如果您不寻找快速解决方案,则可以动态构建和执行命令。 喜欢这个:
cmd="ls" if [ "foo" != "bar" ] ; then cmd="$cmd -a" then # ... and so on # now execute it: $cmd
你可以使用eval
来执行一个字符串:
eval $cmdstring
有一个bash内建的eval,它执行的命令就像在你的shell中输入一样。 例如在你的脚本中,你可以执行以下操作:
eval $(echo -e $runc $IP $cc | grep Algeria)
这将在一个子shell中处理你的回声,输出将像你在你的shell中输入,然后输入。
请参阅下面的bash手册exerpt:
eval [arg …]参数被读取并连接成一个命令。 这个命令然后被shell读取和执行,并且它的退出状态作为eval的值被返回。 如果没有参数,或者只有null参数,则eval返回0。
使用grep -E
和模式代替:
$runc $IP $cc | grep -E 'Algeria|Argentina|...'
说明: echo
将打印命令但不执行它。 只是省略它来实际执行命令。
而不是运行脚本5次,使用grep
一次搜索五种模式中的任何一种。
你应该使用
cc=$(geoiplookup $IP)
而不是反引号; 更安全
echo `pwd`
上面的命令适合我。
只要把你的命令做成这样的假设:
echo $(ls)