Bash可以将变量转储为shell转义字符串:
$ X='1 2 te$t'; Y=$' \a\n\t '; printf '%q %q\n' "$X" "$Y" > .data
$ cat .data
1\ 2\ te\$t $' \a\n\t '
是否可以从文件.data中恢复变量X和Y?它应该是安全的,即使.data包含$(rm -rf /*)
。
我正在搜索以“每条记录一行”格式存储记录(变量X,Y)的方式。
修改
在我的任务printf '%q'
中,可能会被Python的urlquote取代。解决方案:
$ X='1 2 te$t'; Y=$' \a\n\t ';
$ alias urlquote="python -c'import urllib, sys; print urllib.quote(sys.stdin.read())'"
$ alias urlunquote="python -c'import urllib, sys; print urllib.unquote(sys.stdin.read())'"
$ echo $(echo -n "$X" | urlquote) $(echo -n "$Y" | urlquote) > .data
$ cat .data
1%202%20te%24t %20%07%0A%09%20
$ while read -r x y; do
> x=$(echo "$x" | urlunquote)
> y=$(echo "$y" | urlunquote)
> printf '%q %q\n' "$x" "$y"
> done < .data
1\ 2\ te\$t $' \a\n\t '
答案 0 :(得分:3)
更新回答:
据我所知,printf%q的输出在没有eval的情况下无法重构,并且eval总是容易受到任意命令执行的影响。您需要使用bash不直接支持的编码,例如使用base64:
#!/bin/bash
X='1 2 te$t';
Y=$' \a\n\t ';
echo "$(base64 -w0<<<"$X") $(base64 -w0<<<"$Y")" > .data
cat .data|while read line; do
X2=$(base64 -d<<<${line%% *})
Y2=$(base64 -d<<<${line#* })
printf "%q %q\n" "$X2" "$Y2"
done
(删除原始答案,查看帖子历史记录)
答案 1 :(得分:0)
我确定我会这样做
X='1 2 te$t'
Y=$' \a\n\t '
{
printf "X=%q" "$X"
printf "Y=%q" "$Y"
} > .data
然后恢复:
source .data
修改强>
你为什么不
(echo "$X"; echo "$Y") > .data
readarray ENVVARS < .data
X="${ENVVARS[0]}"
Y="${ENVVARS[1]}"
请注意,readarray
需要bash 4+。您可以使用read