我想用 bash 创建一个人类可读的变量,但随后也能够将该变量作为 python 脚本运行。
run_cmd(){
echo "[+] Creating stuff"
run_command="$script 10.10.10.10 \\
--config $settings \\
--cid $cid \\
-v"
echo -e "$run_comamnd"
$run_command
}
run_cmd
运行上面将打印出以下内容
[+] Creating stuff
pythonscript 10.10.10.10 \
--config $settings \
--cid $cid \
-v"
usage: pythonscript [-v] --cid CID --config CONFIG host
pythonscript: error: unrecognized arguments \ \ \
如果我删除
\\
并且只有 \
如下所示,命令运行但输出删除所有新行字符。
run_cmd(){
echo "[+] Creating stuff"
run_command="$script 10.10.10.10 \
--config $settings \
--cid $cid \
-v"
echo -e "$run_comamnd"
$run_command
}
run_cmd
输出
[+] Creating stuff
pythonscript 10.10.10.10 --config $settings --cid $cid -v"
[+] this output is from pythonscript, the script ran successfully.
我知道如果我从变量中完全删除
\
,它将打印出新行并运行命令。但是我想要\
所以有人可以复制输出的命令并直接从命令行运行,所以我需要\
输出。
我的蛋糕怎么吃?就像用新行打印出命令并运行它一样,而不必为 echo 语句和 run 语句创建单独的变量?
为此,您可以在 Bash 中使用“heredoc”语法。这允许您定义多行字符串而无需转义任何字符(包括换行符),然后将该字符串传递给命令。以下是修改 run_cmd 函数以使用 heredoc 的方法:
run_cmd(){
echo "[+] Creating stuff"
read -r -d '' run_command << EOF
$script 10.10.10.10 \
--config $settings \
--cid $cid \
-v
EOF
echo -e "$run_command"
eval "$run_command"
}
在此版本的函数中,我们使用 heredoc 语法定义 run_command 字符串。 << EOF indicates the start of the heredoc, and the EOF indicates the end. The -r option to read tells it not to interpret backslashes in the input, and the -d '' option tells it to read until the end of input (which is signaled by the EOF marker).
使用此版本的 run_cmd,echo 语句将打印带有换行符的多行字符串,eval 语句将其作为命令执行。请注意,我们使用 eval 而不是 $run_command 因为我们希望 shell 解释字符串中的参数,而 eval 是最简单的方法。
使用这种方法,您可以创建一个人类可读的多行字符串,然后以保留换行符的方式将其作为命令执行。