gpt4 book ai didi

bash - 在 bash 中创建用于评估的安全方法

转载 作者:行者123 更新时间:2023-11-29 09:42:27 25 4
gpt4 key购买 nike

想要在 perl 中准备一个字符串,以便在 bash 中对其进行评估,例如:

str="$( perl -E '$sq=chr(047);say qq{var1=${sq}hello world${sq}}' )" #this just for demo - the real perl scirpt is ofcourse real complex script ...
echo "got for eval: [[$str]]"
eval "$str"
echo "var1 : [[$var1]]"

它打印:

got for eval: [[var1='hello world']]
var1 : [[hello world]]

当然eval是危险的,所以perl脚本需要做一些准备。

一件事是,将值中的所有 '(单引号)替换为 '"'"',因此分配 时不要这样做var 它应该打印为

var='don'"'"'t do this' #safe for eval.

这里还有一些我应该在 perl 脚本中为 safe eval 准备变量赋值(var='some content')字符串的注意事项吗?

我的真实脚本片段:

#!/usr/bin/env perl
use strict;
use warnings;

sub make_var {
my($name, $value) = @_;
die "Wrong variable name [$name]" if $name =~ /\W/;
my $sval = sanitise($value);
#warn qq{$name='$sval'\n};
print qq{$name='$sval'\n};
}

sub sanitise {
my $str = shift;
$str =~ s/'/'"'"'/gs;
# what more i should do here?
return $str;
}

#usage
make_var('var1', q{some
multiline
value
where i should'nt miss
escape the single quotes});

打印一个对 eval 安全的字符串。

var1='some
multiline
value
where i should'"'"'nt miss
escape the single quotes'

编辑:背后的理由:

bash 中,我需要许多变量,这些变量的值由 perl 脚本生成。对于一个变量,我可以这样做:

var="$(my_script)"

但我需要在 bash 脚本中使用许多变量。做

var1="$(my_script some args)"
var2="$(my_script other args)"
...
var10="$(my_script bla bla)"

相当昂贵且缓慢。 (perl 脚本做很多事情,最昂贵的是 - 它从 web 获取 json...)因此,想要将调用次数减少为一个 - 这需要 eval

我想到了一些奇怪的模式:

';date;':      var2=''"'"';date;'"'"':' # the escaping solves it
$(date) var='$(date)' # safe

最佳答案

这是一个糟糕的提议。我建议你忘记 eval 而不是编写您的 Perl 代码,以便它以空格分隔的字符串将值返回到标准输出。然后你可以在 bash 中使用 read 将它拆分

read -r var1 var2 var3 rest <<< $(perl -E '...print "val1 val2 val3\n"')

如果你愿意,你可以读入数组

read -r -a vars <<< $(perl -E '...print "val1 val2 val3\n"')

现在值在 vars[0]vars[1]vars[2]

如果值可能包含空格,那么您应该使用数据中从未使用过的不同分隔符(如逗号 , 或冒号 : )并设置 IFS 到读取前的那个字符

关于bash - 在 bash 中创建用于评估的安全方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42873990/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com