回显包含bash中可执行脚本的文件内容

时间:2014-04-09 10:29:04

标签: bash shell echo cat

当我写入控制台时,例如这样:

echo -e "directory content: \n $(ls -l)"

我会得到这样的东西:

directory content:
-rw-rw-r--. 1 user user    0 Apr  9 10:28 file.txt

没关系,但是我希望在一个文件中有“目录内容:\ n $(ls -l)”并写入bash脚本,该文件将被读取并将其内容与执行的脚本一起回显到另一个文件。

我写了这个简单的脚本

#!/bin/bash
FILE=$(<file.txt)
echo -e "$FILE"

不幸的是,猫可能会逃脱角色,所以在执行后我得到了这个

directory content: 
 $(ls -l)

有没有办法如何获得正确的结果?

3 个答案:

答案 0 :(得分:1)

FILE=$(<file.txt)

这会将file.txt的文字内容放入FILE。从那时起,file.txt的内容 - 包括$()部分 - 被视为字符串,仅此而已。你没有得到ls执行的原因不是一些字符转义,而是没有执行FILE所涉及的内容。

你想要什么 - 字符串的内容执行 - 通常被认为是一个明显的安全漏洞(因为你的脚本没有完全控制file.txt的内容,即对代码注入开放。例如Perl通过eval明确允许这个; 我知道bash 没有这样的功能(如fredtantini所指出的那样)这对于bash也是可能的......对他来说是+1。 (虽然我很确定这是不是最佳做法,原因如下。)

答案 1 :(得分:1)

您可以尝试:

bash-3.2$ cat file.txt
directory content: \\n $(ls -l)


bash-3.2$ MYFILE=$(<file.txt)
bash-3.2$ eval echo -e "$MYFILE"
directory content:
 total 8 -rw-r--r-- 1 fti staff 32 09 avr 12:40 file.txt

不确定是否是最好的做法。

答案 2 :(得分:0)

您正在将代码与数据混为一谈:不要这样做。相反,创建一个shell脚本并源或执行它。

$ cat file.sh
echo directory content:
ls -l

$ . file.sh
directory content:
-rw-rw-r--. 1 user user    0 Apr  9 10:28 file.txt

$ MYFILE=$( bash file.sh )
$ echo "$MYFILE"
directory content:
-rw-rw-r--. 1 user user    0 Apr  9 10:28 file.txt
相关问题