读取printf'%q'的结果“$ VAR”

时间:2011-11-04 22:19:25

标签: bash printf

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 '

2 个答案:

答案 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

近似相同