从文件中读取命令

从文件中读取命令

我已将命令保存在一个文件中,并尝试从另一个文件中读取它。没有管道的命令可以正常工作,但是只要命令中有管道,它就不会被执行。

谁能帮我吗?

脚本

#!/bin/bash
rm -f /ZLD_Implement/ZLD_Implement.txt
while IFS=#, read -r Command_info1 Command; do
     variable1=$Commandenter code here
echo "$Command_info1" >> /ZLD_Implement/ZLD_Implement.txt
echo "`$variable1`"  >> /ZLD_Implement/ZLD_Implement.txt
done < /ZLD_Implement/ZLD_Command_list.txt

命令列表:

[root@localhost ZLD_Implement]# cat ZLD_Command_list.txt
Command to check the hostname # hostname
Command to check the linux kernel version # uname -a
Command to check the current system date # dateer code here
Command to check Disk space # df -kh
Command to cheeck routes in Netstat # netstat -nrv
command to check audit logs # ausearch -i -m USER_CHAUTHTOK,USER_MGMT,USER_AUTH` -if /var/log/audit/audit.log|tail -50nter code here

答案1

shell 在扩展变量之前解析管道(以及重定向、引号和转义等等),因此如果您将管道(或重定向或...)放入变量中,那么当它扩展时,就已经太晚了,无法运行通常情况下;那时,它只是命令的常规参数。看BashFAQ #50:我试图将命令放入变量中,但复杂的情况总是失败!

解决方案:在这种情况下,我实际上建议使用eval.eval作为一个吸引虫子的磁铁,它的名声非常不好,因为很容易以危险的方式滥用它。基本上,它的目的是像 shell 语法和命令一样执行数据,这意味着可执行代码和惰性数据(如文件名)之间的界限比通常情况下更弱。但在本例中,从ZLD_Command_list.txt读取的数据是应该是被视为 shell 语法和命令。如果rm -R /文件中有一个,那就是应该删除整个文件系统。

但是,您仍然应该遵守正确的引用。这意味着双引号变量,例如eval "$variable1"而不只是eval $variable1.另外,我建议使用$()而不是反引号(请参阅Bash 常见问题解答 #82),但既然你只是要echo结果,为什么不直接执行命令呢?

其他可能的优化:不要复制$Commandto的值$variable1,而是直接使用它。为什么不重定向整个循环的输出,而不是分别重定向每个命令的输出呢?

这是我的版本,上面所有内容都已修复:

#!/bin/bash
while IFS=#, read -r Command_info1 Command; do
    echo "$Command_info1"
    eval "$Command"
done < /ZLD_Implement/ZLD_Command_list.txt > /ZLD_Implement/ZLD_Implement.txt

哦,您想捕获命令的错误输出以及标准输出吗?如果是这样,请2>&1在最终重定向之后添加。

相关内容