我一直在尝试获取perl子例程值和替换,以从exim.conf中的randomips子例程获取字符串所需的部分。但是,当我使用字符串替换时,我得到如下错误:
Here is what I am trying to achieve
我试图用冒号分割字符串并将第一次出现作为“接口”。我将使用第二次出现作为“helo_data。
exim.pl
sub randomhosts {
@inet = ("x.x.x.1:hostname1.domain.com","x.x.x.2:hostname2.domain.com","x.x.x.3:hostname3.domain.com"
);
return $inet[int rand($#inet+1)];
}
exim.conf
dkim_remote_smtp:
driver = smtp
interface = "${perl{randomhosts}%:*}"
helo_data = "${sender_address_domain}"
我得到的错误如下:
"failed to expand "interface" option for dkim_remote_smtp transport: missing '}' after 'perl'".
可能是语法。
有什么帮助吗?
答案 0 :(得分:2)
您尝试复制的代码是由对Perl不太了解的人编写的。它包括这一行:
return $inet[int rand($#inet+1)];
Perl程序员会把它写成
return $inet[rand @inet];
我认为这里有几个问题 - 一个是你的Exim语法,一个是你的Perl语法。
Exim给你这个错误:
未能扩展"界面" dkim_remote_smtp传输的选项:缺少'}'在' perl'
之后
我对从Exim调用Perl一无所知,但是this page提到的语法类似${perl{foo}}
(类似于您正在复制的页面中使用的语法)和一个像${perl{foo}{argument}}
一样调用子程序并传递一个参数。它没有提到像你这样的语法:
${perl{randomhosts}%:*}
我不确定你从哪里获得这种语法,但似乎这可能是导致你第一次出错的原因。
在评论中,你说
我正在为#"接口"的每个随机数组值获取冒号前的字符串的第一部分。和#34; helo_data"
之后的冒号
在我看来,Exim并不支持这一要求。您需要调用该函数两次才能获得所需的两条信息。您可以使用类似state
变量之类的东西在Perl中执行此操作 - 但它会比您当前的代码复杂得多。
其次,您的Perl代码存在语法错误,因此即使Exim能够调用您的代码,它也无法正常工作。
您正在复制的代码设置@inet
,如下所示:
@inet = ("x.x.x.1", "x.x.x.2", "x.x.x.3", "x.x.x.4");
您的等效代码是:
@inet = (
"x.x.x.1:hostname1.domain.com",
"x.x.x.2:hostname2.domain.com,
x.x.x.3:hostname3.domain.com
);
我已重新格式化,以使问题更加明显。您缺少数组元素周围的多个引号。 (注意:我看到,当我写这个答案时,你已经解决了这个问题。)
更新:好的,这里有一些代码放入exim.pl
,可以满足您的需求。
use feature qw[state];
sub randomhosts {
state $current;
my @inet = (
"x.x.x.1:hostname1.domain.com",
"x.x.x.2:hostname2.domain.com",
"x.x.x.3:hostname3.domain.com"
);
if ($_[0] eq 'generate') {
shift;
@{$current}{qw[ip host]} = split /:/, $inet[rand @inet];
}
return $current->{$_[0]};
}
如果第一个参数是' generate'它会生成一个新的ip / host对。然后它将从生成的对返回主机名或IP地址。我想你可以从你的Exim配置文件中调用它:
dkim_remote_smtp:
driver = smtp
interface = "${perl{randomhosts}{generate}{ip}}"
helo_data = "${perl{randomhosts}{host}}"
但我不是Exim的专家,所以语法可能需要调整。
答案 1 :(得分:1)
首先,我想说明我没有使用exim,所以我不能说你到底想要做什么以及为什么你这样做了。
在您发布的链接中,有一种叫做“randinet”的方法。添加到exim.pl中,exim.conf中的接口行替换为
interface = "${perl{randinet}}"
您已经实施了随机主机'方法并用
替换了接口行 interface = "${perl{randomhosts}%:*}"
现在解析器抱怨没有找到结束括号。这可能是由于您可以随意添加的符号,但解析器无法忽略。
我建议你试试
interface = "${perl{randomhosts}}"