linux 我可以使用ECHO来执行命令吗?

q1qsirdb  于 2023-11-17  发布在  Linux
关注(0)|答案(7)|浏览(140)

我已经想出了一个很酷的脚本,它将产生我需要的输出,但它只显示在屏幕上,所以我必须复制,然后粘贴命令才能执行它们。下面是我的脚本的缩写版本:

#!/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我错过了,实际上会运行命令,而不仅仅是打印出来的行?

v09wglhw

v09wglhw1#

把你的命令放在括号里,就像这样:

echo $(ls)

字符串
您也可以在命令前添加文本

echo "The date is $(date)"


例如

echo "Enter Text Here $(Command Here)"

ddarikpa

ddarikpa2#

一个不需要修改脚本的简单方法是将命令的输出管道到另一个bash示例。像这样:

yourscript | bash -

字符串
-告诉bash它应该从stdin读取命令。
然而,如果你不是在寻找一个快速的解决方案,也可以动态地构建和执行命令。像这样:

cmd="ls"
if [ "foo" != "bar" ] ; then
    cmd="$cmd -a"
then

# ... and so on

# now execute it:
$cmd

idv4meu8

idv4meu83#

你可以使用eval来执行一个字符串:

eval $cmdstring

字符串

af7jpaap

af7jpaap4#

有一个bash内置的eval,它执行命令,就像它们在你的shell中输入一样。例如,在你的脚本中,你可以做以下事情:

eval $(echo -e $runc $IP    $cc | grep Algeria)

字符串
这将在一个子shell中处理你的echo,输出将像你在shell中输入的那样执行。
参见下面的bash手册:
eval [arg ...]读取args并将其连接到单个命令中。然后shell读取并执行此命令,并将其退出状态作为eval的值返回。如果没有args,或者只有null参数,则eval返回0。

62lalag4

62lalag45#

echo `pwd`

字符串
上级命令对我有效

w8rqjzmb

w8rqjzmb6#

使用grep -E和模式代替:

$runc $IP    $cc | grep -E 'Algeria|Argentina|...'

字符串
说明:echo将打印命令但不执行它。只需省略它以实际执行命令。
而且,不用运行脚本5次,而是使用grep一次搜索五种模式中的任何一种。
你应该用

cc=$(geoiplookup $IP)


而不是反引号这样更安全

wlzqhblo

wlzqhblo7#

你应该像这样进一步管道这些echogrep命令:

...
echo -e "$runc $IP    $cc" | grep Algeria | sh
...

字符串
让我们以这个命令为例:

$ echo -e "echo AAA\necho BBB\necho CCC"

echo AAA
echo BBB
echo CCC


因此,我们只需要AAA

$ echo -e "echo AAA\necho BBB\necho CCC" | grep AAA

echo AAA


现在实际执行echo AAA

  • shbash
$ echo -e "echo AAA\necho BBB\necho CCC" | grep AAA | sh

AAA

  • xargs
$ echo -e "echo AAA\necho BBB\necho CCC" | grep AAA | xargs command

AAA


如果您实际上需要**打印和执行命令,则可以使用tee

$ echo -e "echo AAA\necho BBB\necho CCC" | grep AAA | tee /dev/tty | sh

echo AAA
AAA


$ echo -e "echo AAA\necho BBB\necho CCC" | grep AAA | tee >(sh)

echo AAA
echo


xargs -t的工作原理类似:

$ echo -e "echo AAA\necho BBB\necho CCC" | grep AAA | xargs -t command

command echo AAA
AAA


xargssh/bash可能并不总是按预期工作,例如:

$ echo "echo echo | rev" | tee /dev/tty | xargs command

echo echo | rev
echo | rev


vs:

$ echo "echo echo | rev" | tee /dev/tty | sh

echo echo | rev
ohce


使用带有多个重定向的tee

$ echo "echo echo | rev" | tee >(sh) >(xargs command)

echo echo | rev
ohce
echo | rev

相关问题